2012-06-20 42 views
3

我有使用system()函數調用robocopy.exe的Perl代碼,但它看起來像是在修改參數。我使用Chef,它通過Cygwin捆綁Perl - 「這是爲msys-64int構建的perl,v5.8.8」。我認爲Cygwin正在逃脫一些字符,但system()不會告訴我它實際傳遞給shell的內容,所以我不知道如何正確地格式化該調用。Perl的系統()會在Cygwin中自動轉義字符嗎?

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:30R:\ 30 \

看起來像(cygwin或perl或system())在將它們傳遞到shell之前會自動轉義某些字符。問題是沒有辦法讓我看到它的變化,所以我不知道如何自定義我的命令才能正常工作!

請注意,如果我使用反引號代替system()函數,則行爲完全相同。

+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); 
+0

更新了我的答案。 – ikegami

+0

完美。我必須硬編碼「C:/windows/system32/cmd.exe」,因爲cygwin完全打破了%PATH%,但我會想出一個更優雅的解決方案。目前來說,它效果很好,謝謝! –

+0

Cygwin在啓動shell程序之前將%PATH%轉換爲相應的POSIX格式。使用Cygwin實用程序cygpath在POSIX格式(例如/ cygdrive/c/windows/system32)和DOD/Windows格式(例如C:\ windows \ system32)之間進行轉換。 –