2012-02-06 91 views
1

我有一個需要產生子命令行進程的GUI Ruby工具,例如ping。如果我在Windows上執行此操作,那麼控制檯窗口將顯示並消失以進行控制檯進程,這非常煩人。是否可以從GUI Ruby腳本啓動一個沒有控制檯窗口可見的進程?如果我使用反引號運算符或Kernel#system,將出現在控制檯窗口,見下面的例子:是否有可能從紅寶石GUI腳本(.rbw)啓動控制檯進程

require 'Tk' 
require 'thread' 
Thread.new { `ping 8.8.8.8` } 
TkRoot.new.mainloop 

enter image description here

回答

2

問題是,Windows上的每個可執行文件都被定義爲GUI可執行文件或控制檯可執行文件(還有更詳細的信息,但這並不重要e)當它建立時。運行你的Ruby腳本的可執行文件是一個GUI可執行文件(它也恰好使用Tk來實際構建一個GUI,即使在你的屏幕截圖中只有一個非常簡單的GUI),而且可執行文件是一個Console可執行文件。如果一個GUI可執行文件啓動一個Console可執行文件,一個控制檯會自動創建來運行可執行文件; 不能改變這個

當然,圖片比這更復雜。這是因爲控制檯應用程序實際上可以與GUI一起工作(它只需要執行正確的API調用),並且可以使用整個技巧目錄來使控制檯窗口保持不變(例如通過適當地啓動ping配置的快捷方式文件),但這樣的事情很尷尬。最簡單的方法是讓Ruby本身成爲一個控制檯應用程序(通過naming your script with the .rb suffix, not .rbw),讓控制檯窗口一直在那裏。是的,它並沒有真正擺脫這個問題,但它會阻止任何惱人的閃光。

如果您使用ping作爲您的應用程序的目的(即查明服務是否已啓動),那麼我會考慮是否有可能/建議您直接在Ruby中通過連接來編寫檢查代碼該服務不是ping它,因爲ping只是測量目標OS內核是否處於活動狀態,而不是服務可執行文件。這是一個很好的區別,但我已經看到機器進入沒有可執行文件運行的狀態,但機器仍然響應ping;這是奇怪,可以完全打破你的精神抽象,但可以發生。但是因爲你只使用ping作爲例子,所以我認爲你可以只關注(相當有問題的)控制檯處理。儘管如此,如果你可以在不運行子進程的情況下做到這一點,那麼一定要選擇這種方法(在Windows上;如果你在任何一種Unix上,你根本就不會有這個問題)。

+0

的「文藝青年最愛的」版:這是Windows的問題,並不是Ruby的問題。 – 2012-02-08 08:56:01

+0

感謝您的全面回答。我知道在移植可執行格式控制檯子系統標誌,並希望它的一些技巧在Ruby中可以處理這個,對於STARTF_USESHOWWINDOW和SW_HIDE例如CreateProcess的:)。看來我需要使用Win32API Ruby庫並手動調用CreateProcess O_O。 – grigoryvp 2012-02-08 11:39:44

+0

@EyeofHell:這樣做是可以的,但我不鼓勵做深黑客攻擊,如果你不_need_它。你可能想閱讀http://rubyforge.org/docman/view.php/85/1720/Process.html – 2012-02-08 12:43:37

1

它確實有可能使用Ruby創建子進程。這是一個couple of ways to do it。我不知道你

意味着控制檯窗口將出現並dissapear控制檯過程

什麼,但我認爲最好的方法可以讓你做到這一點是根本搶出來,犯錯和表演它在你自己的窗口給你的用戶。如果你想讓本地的Windows控制檯顯示出來,你可能需要使用Windows腳本編程。保持催生控制檯活着

1

一種方法是將它運行一個批處理文件,並在最後一個PAUSE命令:

rungping.bat:

ping %1 
pause 
exit 

在Ruby文件:

Thread.new {`start runping.bat 8.8.8.8`}