我正在尝试为我的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可以正常工作。
到目前为止,我已经尝试过这些东西,但还没有成功的结果:
mstest = "C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/mstest.exe"
mstest = "C:/Program\ Files\ (x86)/Microsoft\ Visual\ Studio\ 12.0/Common7/IDE/mstest.exe"
mstest = "C:/Program\s Files\s (x86)/Microsoft\s Visual\s Studio 12.0/Common7/IDE/mstest.exe"
mstest = "C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\Common7\\IDE\\mstest.exe"
我该如何解决这个问题?
答案 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
如何转义括号。