3

我有使用 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() 函数,则行为完全相同。

4

1 回答 1

1
system($shell_cmd);

永远不会逃避任何事情。能逃出什么?

问题是您试图在 bourne shell 中运行 Windows shell 命令。

system($shell_cmd)

简称

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

在 unix 系统上(包括 unix 仿真层,例如 Perl 的 cygwin 构建)。下面的工作吗?

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