2015-05-01 2 views
3

Я пытаюсь создать файл rake для моего приложения ASP.Net. Это путь к файлу MSTest.exe:Как использовать пути с пробелами в задаче Rake?

mstest = "C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/mstest.exe" 

Это часть rakefile у меня есть:

task :default do 
     mstest = "C:/Program\ Files\ (x86)/Microsoft\ Visual\ Studio\ 12.0/Common7/IDE/mstest.exe" 
     sh "#{mstest_file} \"#{testdll_file} " 
end 

Я получаю эту ошибку:

rake aborted! Albacore::CommandNotFoundError: Command failed with status (127) - number 127 in particular means that the operating system could not find the executable:

C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/mstest.exe

Я думаю пространства в пути вызывают ошибку: «Program Files (86x)/Visual Studio ...», потому что, если в пути нет места, файл rake работает правильно.

Я пробовал эти вещи до сих пор, но не имеют успешные результаты пока:

  1. mstest = "C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/mstest.exe"
  2. mstest = "C:/Program\ Files\ (x86)/Microsoft\ Visual\ Studio\ 12.0/Common7/IDE/mstest.exe"
  3. mstest = "C:/Program\s Files\s (x86)/Microsoft\s Visual\s Studio 12.0/Common7/IDE/mstest.exe"
  4. mstest = "C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\Common7\\IDE\\mstest.exe"
  5. Ввод MSTest и # {MSTest} в одинарные кавычки , двойные кавычки и комбинации этих двух.

Как это исправить?

ответ

3

Проблема в том, что вы используете двойные кавычки с экранированными пробелами вместо одиночных кавычек. Рассмотрим эти:

"foo\ bar" # => "foo bar" 
'foo\ bar' # => "foo\\ bar" 

или:

"C:/Program Files\ (x86)/Microsoft\ Visual\ Studio\ 12.0/Common7/IDE/mstest.exe" 
# => "C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/mstest.exe" 
'C:/Program Files\ (x86)/Microsoft\ Visual\ Studio\ 12.0/Common7/IDE/mstest.exe' 
# => "C:/Program Files\\ (x86)/Microsoft\\ Visual\\ Studio\\ 12.0/Common7/IDE/mstest.exe" 

Обратите внимание, как первый, используя двойные кавычки, говорит «использовать буквальный символ», когда интерпретатор встречает "\ ". Используя одинарные кавычки, он говорит «использовать обратную косую черту с последующим пробелом», которую вы хотите использовать, так как вы хотите, чтобы обратная косая черта распространялась в ОС при передаче строки.

Действительно, хотя, вы, вероятно, должны смотреть на использование рубин встроенный в Shellwords классе:

Manipulates strings like the UNIX Bourne shell

This module manipulates strings according to the word parsing rules of the UNIX Bourne shell.

В частности, взгляд на shellescape:

Escapes a string so that it can be safely used in a Bourne shell command line.

Рассмотрим это:

require 'shellwords' 

'C:/Program Files\ (x86)/Microsoft\ Visual\ Studio\ 12.0/Common7/IDE/mstest.exe' 
# => "C:/Program Files\\ (x86)/Microsoft\\ Visual\\ Studio\\ 12.0/Common7/IDE/mstest.exe" 
Shellwords.escape("C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/mstest.exe") 
# => "C:/Program\\ Files\\ \\(x86\\)/Microsoft\\ Visual\\ Studio\\ 12.0/Common7/IDE/mstest.exe" 

Обратите внимание на то, что shellescape также избежал скобок.

Смежные вопросы