我有使用 system() 函数调用 robocopy.exe 的 Perl 代码,但它看起来像是在修改参数。我正在使用 Chef,它通过 Cygwin 捆绑 Perl - “这是 perl,为 msys-64int 构建的 v5.8.8”。
我认为 Cygwin 正在转义一些字符,但 system() 不会向我显示它实际传递给 shell 的内容,所以我不知道如何正确格式化调用。
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
当我将调试输出剪切并粘贴到 shell(甚至是 Cygwin shell)中时,它运行得很好。但是,请查看 robocopy 输出,了解它告诉您 Source 和 Dest 的位置。请注意它如何将我的/r:30参数更改为R:\30\?
似乎某些东西(cygwin 或 perl 或 system())在将某些字符传递给 shell 之前会自动转义它们。问题是我无法看到它发生了什么变化,所以我不知道如何自定义我的命令才能正常工作!
请注意,如果我使用反引号而不是 system() 函数,则行为完全相同。