如何在Rake任务中使用带空格的路径?

时间:2015-05-01 18:56:25

标签: c# asp.net ruby rakefile albacore

我正在尝试为我的ASP.Net应用程序创建一个rakefile。这是mstest.exe文件的路径:

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

我收到此错误:

  耙子流产了!           Albacore :: CommandNotFoundError:命令失败,状态为(127) - 数字127特别表示操作系统找不到可执行文件:

     

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}放在单引号,双引号和这两者的组合中。
  6. 我该如何解决这个问题?

1 个答案:

答案 0 :(得分: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类:

  

操纵UNIX Bourne shell之类的字符串

     

此模块根据UNIX Bourne shell的单词解析规则处理字符串。

特别要看shellescape

  

转义字符串,以便可以在Bourne shell命令行中安全地使用它。

考虑一下:

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如何转义括号。