Cmd всплывает во время работы rubyw или exe, созданный с ocra - PullRequest
0 голосов
/ 05 мая 2018

После этого: исполняемый файл ruby ​​не запускается ,

Теперь у меня есть еще одна проблема со следующим простым скриптом:

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

Нет проблем.

Так что эта проблема появится, когда я запустил свой exe-файл, созданный с помощью ocra, а также когда я запустил свой скрипт следующим образом:

rubyw efdsk.rb  

Если я прокомментирую следующую строку,

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

Проблема исчезнет, ​​поэтому я думаю, что это связано с системой (). Я также попытался заменить предыдущую строку следующим:

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-файл и скомпилировать его на других компьютерах, Windows 7 и 10. Все та же проблема.

1 Ответ

0 голосов
/ 06 мая 2018

Я решил сам.

Во-первых, мне нужно это в моем сценарии:

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, а также построить exe с ocra. Не надоедающие окна всплывают.

...