3

例として、レーキの下で次のコマンドを実行します。

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
                        ^

一重引用符を使用すると、バック スラッシュの 1 つが失われます。

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

1 に答える 1

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
于 2009-02-09T19:00:41.313 に答える