2011-04-03 69 views
5

我有一个位于目录“C:\ Documents and Settings \ test.exe”中的文件,但是当我用单个qoutes(我无法在此框中显示)编写命令`C:\Documents and Settings\test.exe时,用于执行命令在Ruby中,我无法做到这一点,我收到的错误是找不到文件或目录。我试图用“//”和“\”替换“\”,但似乎没有任何效果。我也使用过系统,IO.popen和exec命令,但所有的努力都是徒劳的。另外exec命令使程序退出,我不想发生。如何在Ruby中执行Windows CLI命令?

在此先感谢。

+0

我假设你的bean,而不是“单引号”“反引号”,但我不会去,除非你确认编辑您的问题。 – davetron5000 2011-08-25 12:30:05

回答

4
`"C:\Documents and Settings\test.exe"` 

`exec "C:\Documents and Settings\test.exe"` 

或任何在qoutes

+0

的主要想法是将路径换成引号。我对Windows不熟悉,所以可能会有其他限制。 – fl00r 2011-04-03 18:28:56

+0

不知道我正在使用的文件是否有在Ruby程序中工作的一些约束,或者我指定文件路径的方式不正确,但该东西不适用于我......但是您的方法已告知是正确的! – 2011-04-03 18:43:02

+0

那么......一切正常? – fl00r 2011-04-03 18:47:27

7

倒引号环境就像是双引号,让反斜线用于逃跑。此外,将Ruby解释空格作为分隔命令行参数,所以你需要引用整个事情:

`"C:\\Documents and Settings\\test.exe"` 

另一种选择是使用system,迫使第二个参数。如果system获得多于一个参数,它把第一个参数的路径要执行的命令,你不需要引用命令:

system('C:\Documents and Settings\test.exe','') 

注意使用单引号,所以我们没有逃避反斜杠。

当然,这不会让你的标准输出/错误,所以如果你是关于Ruby 1.9.2,您可以使用赫然得心应手Open3库,它的工作原理是system,但给你有关的更多信息过程中你只是跑:

require 'open3' 

stdout,stderr,status = Open3.capture3('C:\Documents and Settings\test.exe','') 

puts stdout # => string containing standard output of your command 
puts stderr # => string containing standard ERROR of your command 
if status.success? 
    puts "It worked!" 
else 
    puts "OH NOES! Got exit code #{status.exitstatus}" 
end 
+0

用于Open3的未定义方法'capture3':使用红宝石的模块(NoMethodError)1.8.7 – stack1 2015-05-04 20:32:42