繁体   English   中英

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

[英]Is it possible to start console process from ruby GUI script (.rbw)

我有一个GUI Ruby工具,需要生成一个子命令行过程,例如ping。 如果我在Windows上执行此操作,控制台窗口将出现,并且在控制台过程中消失,这非常烦人。 是否可以从没有控制台窗口的GUI Ruby脚本启动进程? 如果我使用反引号运算符或Kernel#system ,则将显示控制台窗口,请参见以下示例:

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

在此处输入图片说明

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

当然,情况要复杂得多。 那是因为控制台应用程序实际上可以与GUI一起使用(它只需要执行正确的API调用),并且您可以使用整个技巧目录来使控制台窗口不受影响(例如,通过适当的方式开始ping操作) -配置的快捷方式文件),但此类操作相当尴尬。 最简单的方法是通过使Ruby本身成为控制台应用程序(通过使用.rb后缀而不是.rbw命名脚本 )来使控制台窗口始终存在。 是的,它并不能真正解决问题,但是可以消除任何令人讨厌的闪烁。

如果您使用ping作为应用程序的目的(例如,确定服务是否启动),那么我想是否有可能/建议通过连接到服务而不是直接在Ruby中编写检查代码来代替ping它,因为ping只是测量目标OS内核是否处于活动状态,而不是服务可执行文件。 这是一个很好的区别,但是我已经看到机器进入一种状态,其中没有可执行文件在运行,但是机器仍在响应ping。 这是非常奇怪的,可以完全破坏您的心理抽象,但是可能发生。 但是由于您仅以ping为例,所以我认为您可以只关注(而不是有问题的)控制台处理。 不过,如果您可以在不运行子进程的情况下做到这一点,那么绝对可以选择该方法(在Windows上;如果您使用的是任何类型的Unix,则根本不会出现此问题)。

确实有可能使用Ruby生成进程。 这是几种方法 我不确定你的意思

控制台窗口将出现,并在控制台过程中消失

但是我认为您最好的方法就是简单地抓住并犯错,然后在自己的窗口中显示给用户。 如果要显示本机Windows控制台,则可能需要使用Windows脚本编写一些内容。

使衍生的控制台保持活动的一种方法是让它在末尾运行带有PAUSE命令的批处理文件:

rungping.bat:

ping %1
pause
exit

在您的ruby文件中:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM