3

system() 関数を使用して robocopy.exe を呼び出す Perl コードがありますが、パラメーターが壊れているようです。Cygwin経由でPerlをバンドルするChefを使用しています-「これはmsys-64int用に構築されたv5.8.8のperlです」。

Cygwin は一部の文字をエスケープしていると思いますが、system() は実際にシェルに渡されているものを表示しないため、呼び出しを正しくフォーマットする方法がわかりません。

my $robocopyCmd = "robocopy.exe /a-:r /r:30 /w:10 c:/folder1 c:/folder2";
print "DEBUG: " . $robocopyCmd . "\n";
system($robocopyCmd);

そして、これが出力です。

DEBUG: robocopy.exe /a-:r /r:30 /w:10 c:/folder1 c:/folder2

-------------------------------------------------------------------------------
ROBOCOPY     ::     Robust File Copy for Windows     ::     Version XP010
-------------------------------------------------------------------------------

Started : Wed Jun 20 10:33:05 2012

Source - R:\30\
Dest - W:\10\

Files :
Options : /COPY:DAT /A-:R /R:1000000 /W:30

------------------------------------------------------------------------------

ERROR : Invalid Parameter #4 : c:/folder1

デバッグ出力をシェル (Cygwin シェルでも) にカット アンド ペーストすると、問題なく動作します。ただし、robocopy の出力で、Source と Dest が示されている場所を確認してください。/r:30の引数が R:\30\ にどのように変更されたかに注目してください

何か (cygwin、perl、または system()) が、一部の文字をシェルに渡す前に自動的にエスケープしているようです。問題は、変更内容を確認する方法がないため、コマンドをカスタマイズして適切に機能させる方法がわからないことです。

system() 関数の代わりにバックティックを使用しても、動作はまったく同じであることに注意してください。

4

1 に答える 1

1
system($shell_cmd);

何も逃げません。何から逃げることができますか?

問題は、ボーン シェルで Windows シェル コマンドを実行しようとしていることです。

system($shell_cmd)

の略です

system('sh', '-c', $shell_cmd)

UNIX システム (Perl の cygwin ビルドなどの UNIX エミュレーション層を含む)。以下は機能しますか?

system('cmd', '/c', $robocopyCmd);
于 2012-06-20T17:49:14.860 に答える