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