問題是,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上,你根本就不會有這個問題)。
的「文藝青年最愛的」版:這是Windows的問題,並不是Ruby的問題。 – 2012-02-08 08:56:01
感謝您的全面回答。我知道在移植可執行格式控制檯子系統標誌,並希望它的一些技巧在Ruby中可以處理這個,對於STARTF_USESHOWWINDOW和SW_HIDE例如CreateProcess的:)。看來我需要使用Win32API Ruby庫並手動調用CreateProcess O_O。 – grigoryvp 2012-02-08 11:39:44
@EyeofHell:這樣做是可以的,但我不鼓勵做深黑客攻擊,如果你不_need_它。你可能想閱讀http://rubyforge.org/docman/view.php/85/1720/Process.html – 2012-02-08 12:43:37