2009-02-08 7 views
3

예를 들어 레이크에서 다음 명령을 실행하려고합니다. 리터럴 문자열의 처리가 어색하지만 Windows에서 명령을 실행하기 위해 rakefile을 작성하는 가장 좋은 방법은 무엇입니까?

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

내가 작업을 얻을 수 있었다 rakefile

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

이중 백 슬래시는 이스케이프 된 단일 백 슬래시로 해석됩니다. 문자열에서 각 백 슬래시를 이스케이프 처리해야합니다.

irb(main):001:0> puts 'robocopy C:\\Media \\\\other\\Media /mir' 
robocopy C:\Media \\other\Media /mir 

정말로, 백 슬래시를 이스케이프하고 싶지 않은 경우, 작은 따옴표 붙은 식별자가있는 여기 문서를 사용할 수 있습니다.

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

+0

문자열에서 백 슬래시를 단순히 이스케이프 처리하는 것이 가장 쉬운 일이 아니라고 생각합니다.하지만 여기서 가능한 문서 구문을 사용하여 답변을 업데이트했습니다. –

+0

좋습니다. HEREDOC은 갈 길입니다. << HEREDOC 구문을 처음 보았습니다. 왜 << HEREDOC은 똑같은 일을하지 않았습니까? – Frank

관련 문제