Создание пакетных заданий в PowerShell
-
09-06-2019 - |
Вопрос
Представьте себе файл в стиле DOS .cmd, который используется для запуска взаимозависимых оконных приложений в правильном порядке.
Пример:
1) Запустите серверное приложение, вызвав exe-файл с параметрами.
2) Дождитесь инициализации сервера (или определенного промежутка времени).
3) Запустите клиентское приложение, вызвав exe-файл с параметрами.
Каков самый простой способ выполнения такого рода пакетных заданий в PowerShell?
Решение
Помните, что PowerShell может обращаться к объектам .Net.Запуск-Сон, как было предложено Блэр Конрад может быть заменен вызовом на WaitForInputIdle Ждать серверного процесса, чтобы вы знали, когда сервер готов, перед запуском клиента.
$sp = get-process server-application
$sp.WaitForInputIdle()
Вы также могли бы использовать Процесс.Начать чтобы запустить процесс и заставить его вернуть точный результат процесса.Тогда вам не нужен get-process.
$sp = [diagnostics.process]::start("server-application", "params")
$sp.WaitForInputIdle()
$cp = [diagnostics.process]::start("client-application", "params")
Другие советы
@Ларс Труйенс предложил
Помните, что PowerShell может обращаться к объектам .Net.Режим ожидания запуска, как предложил Блэр Конрад, может быть заменен вызовом WaitForInputIdle серверного процесса, чтобы вы знали, когда сервер будет готов перед запуском клиента.
Это более элегантно, чем спать в течение фиксированного (или заданного через параметр) промежутка времени.Однако, WaitForInputIdle Ждать
применяется только к процессам с пользовательским интерфейсом и, следовательно, циклом сообщений .
так что это может не сработать, в зависимости от характеристик launch-server-application.Однако, как указал мне Ларс, вопрос относился к оконный приложение (которое я пропустил, когда читал вопрос), так что его решение, вероятно, лучшее.
Чтобы подождать 10 секунд между запусками приложений, попробуйте
launch-server-application serverparam1 serverparam2 ...
Start-Sleep -s 10
launch-client-application clientparam1 clientparam2 clientparam3 ...
Если вы хотите создать скрипт и передать в него аргументы, создайте файл с именем runlink appps.ps1 (или любой другой) со следующим содержимым:
launch-server-application $args[0] $args[1]
Start-Sleep -s 10
launch-client-application $args[2] $args[3] $args[4]
Или, как бы вы ни решили распределить параметры сервера и клиента в строке, которую вы используете для запуска runlink apps.ps1.Если вы хотите, вы могли бы даже передать задержку здесь, вместо жесткого кодирования 10
.
Помните, что ваш файл .ps1 должен находиться по вашему пути, иначе вам придется указать его местоположение при запуске.(О, и я предположил, что запуск серверного приложения и запуск клиентского приложения находятся на вашем пути - если нет, вам также нужно будет указать полный путь к ним.)