8

私はWindows(アクティブPerl)でPerlを使用しています。私は現在のフォルダ内のファイルをグロブし、system()を使用して内部から呼び出されたdoscopyコマンドを使用してそれらすべてを連結するperlプログラムを持っています...

実行すると、「システムは指定されたファイルを見つけることができません」というdosエラーが発生します。それは私が持っているファイル名のスペースに関連しています。

これはperlコードです:-

@files = glob "*.mp3";
$outfile = 'final.mp3';
$firsttime = 1;
foreach (@files)
{

    if($firsttime == 1)
    {
       @args = ('copy' ,"/b ","$_","+","$outfile", "$outfile");
       system (@args);
       #system("copy /b '$_'+$outfile $outfile"); 
       $firsttime = 0;  
    }
    else
    {
       @args = ('copy' ,"/b ","$outfile","+","$_", "$outfile");
       system (@args);
       #system("copy /b $outfile+'$_' $outfile"); 
    }

}

globは、現在のフォルダー内のファイル名の配列を返します。これらのファイル名の間にスペースがあるため、配列要素の間にスペースがあります。上記のようにsystem(...)を使用して、これらの配列要素に対して「$ _」を使用してコピーコマンドを実行すると、上記のようにエラーが発生します。

システムを呼び出すことができるいくつかの方法を試しましたが(...)、成功しませんでした。

私が知りたいのですが、

1]上記のコードを使用して、間にスペースがあるファイルでこれを機能させるにはどうすればよいですか。ファイル名の空白を「エスケープ」する方法。

2]同じことを達成するためのPerlの代替ソリューション。(簡単なものは大歓迎です。)

4

7 に答える 7

11

system()ポータブルライブラリで実行できる呼び出しを行うために使用を停止します。PerlにはFile::Copyモジュールがあり、代わりにそれを使用すれば、このようなことを心配する必要がなく、OSの移植性が大幅に向上します。

于 2010-11-26T15:24:39.687 に答える
9

あなたのコードはファイル名の周りに引用符を追加しません。

試す

"\"$_\""

"\"$outfile\""
于 2010-11-26T14:17:01.403 に答える
7

system正しい答えになることはめったにありませんが、use File::Copy;

すべてのファイルを連結するには:

use File::Copy;
my @in = glob "*.mp3";
my $out = "final.mp3";

open my $outh, ">", $out;
for my $file (@in) {
    next if $file eq $out;
    copy($file, $outh);
}
close $outh;
于 2010-11-26T15:25:59.090 に答える
1

Windowsでは、通常、ファイル名(および/またはパス)を二重引用符で囲み、「長いファイル名」などの特殊文字を使用できます。

C:\"私の長い道のり\これはfile.mp3です"

編集:

これは機能しませんか?

system("copy /b \"$_\"+$outfile $outfile");

(一重引用符ではなく、文字列内の二重引用符に注意してください)

于 2010-11-26T14:17:33.000 に答える
1

$_内部ブロック内の変数にアクセスしようとすると、問題が発生する可能性があります。最も安全な方法、変更:

foreach (@files)

に:

foreach $file (@files)

次に、で必要な変更を行い@args、二重引用符をエスケープして文字列に含めます。

@args = ('copy' ,"/b ","\"$file\"","+","$outfile", "$outfile");
...
@args = ('copy' ,"/b ","$outfile","+","\"$file\"", "$outfile");
于 2010-11-26T14:23:14.810 に答える
0

$ filename =〜s / \ / \ /;

ファイル名が何であれ、スペースを参照するにはスラッシュを使用してください

于 2017-02-28T07:30:59.707 に答える
0

組み込みの「名前の変更」コマンドもファイルを移動します。

    rename $source, $destination;   # ...and move

私はいつもこれを窓で使っています。

于 2019-12-28T23:43:43.363 に答える