Вопрос

Представьте себе файл в стиле 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 должен находиться по вашему пути, иначе вам придется указать его местоположение при запуске.(О, и я предположил, что запуск серверного приложения и запуск клиентского приложения находятся на вашем пути - если нет, вам также нужно будет указать полный путь к ним.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top