2011-04-03 22 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