2015-05-01 104 views
3

我正在尝试为我的ASP.Net应用程序创建一个rakefile。这是mstest.exe文件的路径:如何在Rake任务中使用带空格的路径?

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

这是Rake文件的一部分,我有:

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 ...”,因为如果路径中没有空格,则rakefile可以正常工作。

我至今尝试过这些东西,但没有成功的结果尚未:

  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" 

注意如何第一,使用双引号,是说“使用的字符”在翻译时遇到"\ "。使用单引号表示“使用反斜杠后跟一个空格”,因为您希望在传递字符串时将反斜杠传播到操作系统,所以要使用它。

真的不过,你应该看看使用Ruby的内置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" 

请注意0​​也是如何逃过括号的。