运行 rubyw 或使用 ocra 构建的 exe 时弹出 Cmd
Cmd pop up while running rubyw or an exe built with ocra
在此之后:
,
现在我遇到了以下简单脚本的另一个问题:
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 控制台将弹出不到一秒钟。上面没有输出,我还尝试将其输出重定向到一个文件并且它是空的。
如果我 运行 我的脚本是这样的:
G:\WinRuby\efdsk>ruby efdsk.rb
没有问题。
所以当我 运行 我的 exe 使用 ocra 构建时,以及当我 运行 我的脚本如下时,就会出现这个问题:
rubyw efdsk.rb
如果我评论以下行,
button.command {system("ipconfig > info.txt")}
这个问题会消失,所以我认为它与 system() 有关。
我还尝试用这个替换上一行:
cmd="ipconfig > info.txt"
Open3.popen3(cmd) {|stdin, stdout, stderr, wait_thr|}
但是当我点击按钮时,cmd 将显示相同。
这是我的 ruby 版本:
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 并在其他电脑上编译它,Windows 7 和 10。仍然是同样的问题。
我自己解决了。
首先,我在我的脚本中需要这个:
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 成功了。它设置隐藏新命令 window,因此它不会再弹出。
我尝试使用 rubyw efdsk.rb
并使用 ocra 构建了一个 exe。没有恼人的 windows 弹出。
在此之后:
现在我遇到了以下简单脚本的另一个问题:
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 控制台将弹出不到一秒钟。上面没有输出,我还尝试将其输出重定向到一个文件并且它是空的。
如果我 运行 我的脚本是这样的:
G:\WinRuby\efdsk>ruby efdsk.rb
没有问题。
所以当我 运行 我的 exe 使用 ocra 构建时,以及当我 运行 我的脚本如下时,就会出现这个问题:
rubyw efdsk.rb
如果我评论以下行,
button.command {system("ipconfig > info.txt")}
这个问题会消失,所以我认为它与 system() 有关。 我还尝试用这个替换上一行:
cmd="ipconfig > info.txt"
Open3.popen3(cmd) {|stdin, stdout, stderr, wait_thr|}
但是当我点击按钮时,cmd 将显示相同。
这是我的 ruby 版本:
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 并在其他电脑上编译它,Windows 7 和 10。仍然是同样的问题。
我自己解决了。
首先,我在我的脚本中需要这个:
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 成功了。它设置隐藏新命令 window,因此它不会再弹出。
我尝试使用 rubyw efdsk.rb
并使用 ocra 构建了一个 exe。没有恼人的 windows 弹出。