是否可以从ruby GUI脚本(.rbw)启动控制台进程

时间:2012-02-06 15:28:32

标签: ruby windows tk

我有一个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

3 个答案:

答案 0 :(得分:2)

问题在于,Windows上的每个可执行文件在构建时都被定义为GUI可执行文件或控制台可执行文件(嗯,这里有更多详细信息,但这并不重要)。运行Ruby脚本的可执行文件是一个GUI可执行文件(它也恰好使用Tk实际构建一个GUI,即使屏幕截图中只有一个非常简单的一个),并且ping可执行文件是一个Console可执行文件。如果GUI可执行文件启动Console可执行文件,则会自动创建一个控制台以运行可执行文件; 无法更改

当然,图片比这更复杂。这是因为控制台应用程序实际上可以使用GUI(它只需要进行正确的API调用),并且您可以使用整个技巧目录来使控制台窗口不受阻碍(例如通过适当的方式启动ping - 配置的快捷方式文件)但这样的事情相当尴尬。最简单的方法是让Ruby本身成为一个控制台应用程序(通过naming your script with the .rb suffix, not .rbw),让控制台窗口始终存在。是的,它并没有真正解决问题,但它会阻止任何烦人的闪烁。

如果您使用ping作为应用程序的目的(即,查明服务是否已启动)那么我是否可以通过连接到Ruby来切换到直接在Ruby中编写检查代码。服务而不是ping它,因为ping只测量目标操作系统内核是否存活,而不是服务可执行文件。这是一个很好的区别,但我看到机器进入一个状态,没有可执行文件正在运行,但机器仍然响应ping;这是非常奇怪,可以完全打破你的精神抽象,但可以发生。但由于你只使用ping作为例子,我认为你可以专注于(相当有问题的)控制台处理。尽管如此,如果你可以在不运行子进程的情况下完成它,那么一定要选择那种方法(在Windows上;如果你在任何类型的Unix上,你根本就不会遇到这个问题)。

答案 1 :(得分:1)

确实可以使用Ruby生成进程。这是一个couple of ways to do it

我不明白你的意思
  

控制台窗口将出现并消失,用于控制台进程

但我认为你做到这一点的最好方法就是在你自己的窗口中简单地抓住并错误地显示给你的用户。如果你想要显示原生的Windows控制台,你可能需要使用Windows脚本的东西。

答案 2 :(得分:1)

使生成的控制台保持活动状态的一种方法是让它在最后运行带有PAUSE命令的批处理文件:

rungping.bat:

ping %1
pause
exit

在你的ruby文件中:

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