2012-02-06 26 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`}