问题是,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