2009-02-08 79 views
3

舉個例子,我想在rake下運行下面的命令。編寫rakefile在Windows中運行命令的最佳方法是什麼?

robocopy C:\Media \\other\Media /mir 

的Rake文件我能得到的工作是

def sh(str) 
    str.tr!('|', '\\') 
    IO.popen(str) do |pipe| 
    pipe.each do |line| 
     puts line 
    end 
    end 
end 

task :default do 
    sh 'robocopy C:|Media ||other|Media /mir' 
end 

但是字符串文字的處理是尷尬。

如果我使用一個定界符輸入字符串字面

<<HEREDOC 
copy C:\Media \\other\Media /mir 
HEREDOC 

我得到的錯誤

rakefile.rb:15: Invalid escape character syntax 
copy C:\Media \\other\Media /mir 
     ^
rakefile.rb:15: Invalid escape character syntax 
copy C:\Media \\other\Media /mir 
         ^

如果我使用單引號,背面斜線的一個丟失。

irb(main):001:0> 'copy C:\Media \\other\Media /mir' 
=> "copy C:\\Media \\other\\Media /mir" 

回答

3

雙反斜槓被解釋爲轉義的單個反斜槓。您應該轉義字符串中的每個反斜槓。或者,如果你真的不想逃避反斜槓,你可以使用帶有單引號標識符的here doc。

irb(main):001:0> <<'HEREDOC' 
irb(main):002:0' copy C:\Media \\other\Media /mir 
irb(main):003:0' HEREDOC 
=> "copy C:\\Media \\\\other\\Media /mir\n" 
irb(main):004:0> puts _ 
copy C:\Media \\other\Media /mir 
+0

是的,但像我列在問題中的代碼,它是尷尬逃脫所有反斜槓字符。 – Frank 2009-02-09 20:54:18

相關問題