2012-06-05 36 views
3

我手邊有一個問題,它需要我產生一個命令提示符作爲另一個進程,並向它發送一些命令並捕獲/解析命令輸出。這種交互需要以父子進程的形式表示,所有的命令都可以放在一個ruby文件中,並且在運行ruby文件時,命令被髮送到控制檯(命令提示符)並從它接收輸出並在ruby腳本中處理。在不同的進程中產生命令提示符,並在Windows上發送/接收命令

我將遵循的一般邏輯是:

  1. 菌種不同的工藝通過使用叉,並得到一個進程id
  2. 獲取流的過程
  3. 寫入的輸入流處理並從輸出流中讀取。

我使用的環境是安裝有Ruby 1.9.2的Windows XP機器。我下載了通過here找到的win32進程庫。通過使用圖書館,我可以做第1步如下

require 'win32/process' 
    APP_NAME = "C:\\Windows\\system32\\cmd.exe" 
    process_info = Process.create(:app_name => APP_NAME, 
     :creation_flags => Windows::Process::CREATE_NEW_CONSOLE, 
     :process_inherit => false, 
     :thread_inherit => true, 
     :cwd => "C:\\" 
    ) 

由於Win32的進程庫是基於Windows上使用的進程和線程,我試圖去通過MSDN幫助它。在閱讀Creation of a Console文章時,我發現GetStdHandle方法可用於獲取輸入和輸出流的句柄。但是,我無法在win32-process的任何地方找到這種方法。

有人可以提供一些關於如何進行步驟2和3的指導嗎?

另外,有沒有其他方法可以用來解決手頭的問題?

另外,我想了解更多關於進程間通信或者一般產卵和分支進程的信息,那麼有人可以告訴我一些很好的參考資料,我可以在哪裏研究它們嗎?

在此先感謝

+0

爲什麼你不能只用一個例子'系統() '或反引號來運行你的命令? – Casper

+0

我認爲system()不會返回句柄 – chaitanya

+0

好的,IO.popen'怎麼樣?例如:'IO.popen('dir')。readlines'。 – Casper

回答

3

在這裏,在Windows中使用IO.popen,國際海事組織,如果它的工作原理與STDLIB不使用寶石

IO.popen("other_program", "w+") do |pipe| 
    pipe.puts "here, have some input" 
    pipe.close_write # If other_program process doesn't flush its output, you probably need to use this to send an end-of-file, which tells other_program to give us its output. If you don't do this, the program may hang/block, because other_program is waiting for more input. 
    output = pipe.read 
end 

# You can also use the return value from your block. (exit code stored in $? as usual) 
output = IO.popen("other_program", "w+") do |pipe| 
    pipe.puts "here, have some input" 
    pipe.close_write 
    pipe.read 
end 
+0

如果你想發現其他方法閱讀這個優秀的博客http://devver.wordpress.com/2009/06/30/a-dozen-or-so-ways-to-start-sub-processes-in- ruby-part-1/ – peter

+0

還有更多:http://www.shanison。com/2010/09/01/ruby​​-capture-output-in-realtime/ – Casper

+0

感謝peter和Casper的鏈接和你的幫助 – chaitanya

相關問題