【问题标题】:How do I use paths with spaces in a Rake task?如何在 Rake 任务中使用带空格的路径?
【发布时间】:2015-05-01 18:56:24
【问题描述】:

我正在尝试为我的 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

我收到此错误:

rake 中止! Albacore::CommandNotFoundError: Command failed with status (127) - number 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} 放在单引号、双引号和这两者的组合中。

我该如何解决这个问题?

【问题讨论】:

    标签: c# asp.net ruby rakefile albacore


    【解决方案1】:

    问题是您使用的是带转义空格的双引号,而不是单引号。考虑这些:

    "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 也是如何转义括号的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      相关资源
      最近更新 更多