perl - Perl的system()是否自动在Cygwin中转义字符?

我有使用System()函数调用robocopy.exe的Perl代码,但看起来好像是在修改参数。我使用的是Chef,它通过Cygwin bundle 了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输出中查找告诉源和目标的位置。请注意,它是如何将我的 / r:30 的参数更改为 R:\ 30 \ 的?

似乎某些东西(cygwin或perl或system())在将某些字符传递给shell之前会自动转义。问题是我无法查看它的更改,因此我不知道如何自定义命令以使其正常工作!

请注意,如果我使用反引号而不是system()函数,则行为是完全相同的。

最佳答案

system($shell_cmd);

永远不会逃脱任何东西。可能逃脱什么?

问题是您试图在bourne shell中运行Windows shell命令。
system($shell_cmd)

是短的
system('sh', '-c', $shell_cmd)

在UNIX系统上(包括UNIX仿真层,例如Perl的cygwin构建)。请问以下工作吗?
system('cmd', '/c', $robocopyCmd);

https://stackoverflow.com/questions/11125224/

相关文章:

hibernate - Jpa vs Hibernate - 标准还是功能?

linq-to-sql - Windows 8的Metro风格应用程序中是否可以使用LINQ-to-

for-loop - 无法在for循环中的子句中执行exe

scala - 如何转换 Play ! 2.0 Scala文件转换为CSVReader格式?

.net - 清理代码并进行重构。额外的局部变量

scala - 斯卡拉调度以编程方式登录网站

jquery-mobile - 是否可以在 jquery mobile 的搜索输入旁边有一个按钮?

codeigniter - CodeIgniter DB session 问题:sess_expir

hudson - Jenkins jacoco插件

antlr - 记住 AST 中的 ANTLR 规则/节点