Каков наилучший способ написать Rake-файл для запуска команд в Windows? - PullRequest
3 голосов
/ 09 февраля 2009

В качестве примера я хочу запустить следующую команду под граблями.

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

Рейк-файл, который я смог получить, был

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 для ввода строкового литерала

<<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"

1 Ответ

3 голосов
/ 09 февраля 2009

Двойной обратный слеш интерпретируется как экранированный одиночный обратный слеш. Вы должны избегать каждого обратного слеша в строке.

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
...