Ruby GUIスクリプト(.rbw)からコンソールプロセスを開始することは可能ですか?

私はGUIのRubyツールを持っているので、例えばpingといった子コマンドラインプロセスを起動する必要があります。 Windowsでこれを行うと、コンソールウィンドウが表示され、コンソールプロセスが消えてしまいます。これは非常に面倒です。コンソールウィンドウを表示しないでGUI Rubyスクリプトからプロセスを開始することは可能ですか?バックティックオペレータまたは Kernel#system を使用すると、コンソールウィンドウが表示されます。下記の例を参照してください。

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

enter image description here

1

3 答え

問題は、Windows上のすべての実行可能ファイルは、GUI実行ファイルまたはコンソール実行ファイルのいずれかであると定義されています(それよりも詳細ですが、ここでは問題ありません)。あなたのRubyスクリプトを実行している実行可能ファイルはGUI実行可能ファイルです(実際にはGUIを構築するためにTkを使用しますが、スクリーンショットでは非常に単純なものです)、ping実行ファイルはコンソール実行ファイルです。 GUI実行可能ファイルがコンソール実行可能ファイルを開始すると、実行可能ファイルを実行するためにコンソールが自動的に作成されます。 これを変更することはできません

もちろん、画像はそれより複雑です。これは、コンソールアプリケーションが実際にGUI(正しいAPI呼び出しを行うだけでよい)で動作することができるためであり、コンソールウィンドウを途切れることなく(適切にpingを開始する - 設定されたショートカットファイル)しかし、そのようなことはむしろ面倒です。最も簡単な方法は、Ruby自体をコンソールアプリケーションにすることで、コンソールウィンドウを常時表示させることです( .rb ではなく .rb の接尾辞を使用してスクリプト名を付けます)。はい、それは実際に問題を取り除くわけではありませんが、どんな厄介な点滅も止めます。

アプリケーションの目的としてpingを使用していた場合(つまり、サービスが稼働しているかどうかを調べるために)、Rubyにチェックコードを直接書くのではなく、サービスに接続することが可能かどうかpingはターゲットOSカーネルが稼動しているかどうかを測定するだけで、実行可能なサービスは測定しないためです。これは素晴らしい区別ですが、マシンが実行ファイルが実行されていない状態になりましたが、マシンは依然としてpingに応答していました。これは非常に奇妙で、精神的抽象を完全に破ることはできますが、起こる可能性があります。しかし、pingを例として使用しているだけなので、(やや問題のある)コンソール処理に集中することができます。それでも、サブプロセスを実行せずに実行できるのであれば、その方法を選択してください(Windows上であれば、どんな種類のUnix上であってもこの問題はまったくありません)。

2
追加された
包括的な答えをありがとう。私は移植可能な実行形式でコンソールサブシステムのフラグについて知っていて、これを処理するためにRubyで利用可能なトリックであることを期待していました。例えばCreateProcessはSTARTF_USESHOWWINDOWとSW_HIDE :)です。それは私がWin32API Rubyライブラリを使用し、O_Oを手動でCreateProcessを呼び出す必要があるようです。
追加された 著者 grigoryvp,
私はエンドユーザーのために複数のプラットフォームでバックグラウンドでSubversionを実行する必要があります。 Ruby/PythonのSVNバインディングをインストールすると地獄になりますし、エンドユーザにとっては絶対不可能です:)
追加された 著者 grigoryvp,
"tl; dr"バージョン:これはWindowsの問題であり、Rubyの問題ではありません。
追加された 著者 Donal Fellows,
@EyeofHell:それはうまくいくだろうが、必要ない必要がなければ、深刻なハッキングをすることは勧められない。おそらく、 ruby​​forge.org/docman/view.php/85 /1720/Process.html
追加された 著者 Donal Fellows,
@Eye:SVNクライアントはライブラリとしてかなり可能です。
追加された 著者 Donal Fellows,

実際にRubyでプロセスを生成することは可能です。 これを行う方法はいくつかあります。私はあなたが何を意味するのか分かりません

コンソールウィンドウが表示され、コンソールプロセスで消滅します

しかし、私はあなたがそれを行うための最良の方法は、単にあなた自身のウィンドウであなたのユーザーにそれを出して、それを見せることだと思います。ネイティブのWindowsコンソールを表示したい場合は、おそらくWindowsスクリプティングで何か面白くする必要があります。

1
追加された

生成されたコンソールを有効にする方法の1つは、最後に PAUSE コマンドを使用してバッチファイルを実行させることです。

rungping.bat:

ping %1
pause
exit

あなたのルビーファイル:

Thread.new {`start runping.bat 8.8.8.8`}
1
追加された