Запустите внешнюю программу в ruby ​​и дождитесь ее запуска - PullRequest
9 голосов
/ 11 июля 2011

Как запустить внешнюю программу (например, в листе Excel) из ruby ​​и дождаться ее запуска, соответственно.завершение перед продолжением.

Я знаю, что могу начать лист Excel с

system 'start excel "my/path/to/the/sheet"' 

, но при этом будет только запускать лист, а затем продолжать.

Ответы [ 3 ]

9 голосов
/ 11 июля 2011

Проблема у вас не в Ruby, а в команде запуска, она запускает другую программу и сразу же возвращается.Вам нужно заставить эту команду ждать завершения Excel, используя флаг wait:

system('start /wait excel "my/path/to/the/sheet"')
2 голосов
/ 11 июля 2011

Как уже говорилось, удаление "start" заставит скрипт Ruby ждать.

system("notepad.exe")

Еще один способ сделать это в Ruby - использовать обратную галочку.

`notepad.exe` # Same effect. Will also accept #{} variable insertion 

Однако в качестве примера вы указали Excel. Если вы вызовете обычную командную строку Windows, вы заметите, что пока start excel path\to\sheet откроет Excel, а просто excel path\to\sheet - нет. Вы получите сообщение о том, что «excel» не является распознанной внутренней или внешней командой. Чтобы это исправить, нужно либо добавить путь к Excel в свои переменные среды , либо включить путь к Excel в вызове system().

EXCEL = File.join("C:", "Program Files", 
    "Microsoft Office", "OFFICE11", "excel.exe")
`"#{EXCEL}" "path\to\sheet"` 

(Использование обратных галочек здесь - только мое предпочтение. Я предпочитаю это, так как это позволяет вставлять переменные.) Это вызовет экземпляр Excel, а скрипт Ruby будет ожидать завершения работы приложения.

2 голосов
/ 11 июля 2011

Не используйте запуск!Команда system будет ожидать результата.В командной строке Windows команда start запускает программы асинхронно.

system 'excel yout/path/sheet'

Или вы также можете использовать% x, если хотите получить массив как результат:

%x{ ls }

Если в вашей команде есть команда start ,% x все равно будет ожидать вывода ..

...