Perl的system()会自动转义Cygwin中的字符吗?

时间:2012-06-20 17:47:22

标签: perl cygwin system windows-shell

我有使用system()函数调用robocopy.exe的Perl代码,但看起来它正在破坏参数。我正在使用Chef,它通过Cygwin捆绑Perl - “这是为msys-64int构建的perl,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()函数,行为完全相同。

1 个答案:

答案 0 :(得分:1)

system($shell_cmd);

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

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

system($shell_cmd)

的缩写
system('sh', '-c', $shell_cmd)

在unix系统上(包括unix仿真层,如Perl的cygwin构建版)。以下是否有效?

system('cmd', '/c', $robocopyCmd);
相关问题