运行rubyw或用ocra构建的exe时弹出Cmd

时间:2018-05-05 18:15:15

标签: ruby windows-10 tk ocra

之后: ruby executable won't start

现在我有以下简单脚本的另一个问题:

require 'tk'
require 'tkextlib/tile'

root = TkRoot.new() 

button = Tk::Tile::TButton.new(root) {text "Hello World"}.grid
button.command {system("ipconfig > info.txt")}

Tk.mainloop()  

如果我单击“Hello World”按钮,则Windows cmd控制台将弹出不到一秒钟。没有输出,我也试图将其输出重定向到一个文件,它是空的。

如果我像这样运行我的scprit:

G:\WinRuby\efdsk>ruby efdsk.rb

没有问题。

因此,当我运行使用ocra构建的exe时,以及当我像这样运行脚本时,会出现此问题:

rubyw efdsk.rb  

如果我评论以下一行,

button.command {system("ipconfig > info.txt")}

问题会消失,所以我认为它与system()有关。 我还尝试用以下内容替换上一行:

cmd="ipconfig > info.txt"
Open3.popen3(cmd) {|stdin, stdout, stderr, wait_thr|}

但是当我点击按钮时,cmd会显示相同的内容。

这是我的红宝石版本:

ruby 2.3.3p222 (2016-11-21 revision 56859) [x64-mingw32]

此问题也将出现在以下ruby版本上,由我测试:

ruby 2.1.5p273 (2014-11-13 revision 48405) [x64-mingw32]
ruby 2.0.0p648 (2015-12-16) [x64-mingw32]
ruby 1.9.3p551 (2014-11-13) [i386-mingw32]

我试图运行exe并在其他PC上编译它,Windows 7和10.仍然是同样的问题。

1 个答案:

答案 0 :(得分:2)

我自己解决了。

首先,我在我的剧本中要求这样做:

require 'win32ole'

然后我制作了一个批处理文件,其中包含我需要在文件上打印的命令,在本例中为ip config > info.txt,我将其命名为run.bat

在此之后,我将system()替换为以下内容:

WIN32OLE.new('Shell.Application').ShellExecute('run.bat','','','open',0)

这也可以:

WIN32OLE.new('WScript.Shell').Run("run.bat",0,0)

这里是win32ole

的文档

作为第一个参数,我使用了刚刚创建的批处理文件,最后一个参数0就是诀窍。它将新的cmd窗口设置为隐藏,因此它不会再次弹出。

我尝试使用rubyw efdsk.rb并使用ocra构建一个exe。没有恼人的窗户弹出。