2008-09-08 7 views
5

Представьте файл .cmd в стиле DOS, который используется для запуска взаимозависимых оконных приложений в правильном порядке.Создание пакетных заданий в PowerShell

Пример:
1) Запустите серверное приложение, вызвав exe с параметрами.
2) Подождите, пока сервер станет инициализирован (или фиксированное количество времени).
3) Запустите клиентское приложение, вызвав exe с параметрами.

Каков самый простой способ выполнения такого рода пакетной работы в PowerShell?

ответ

5

Помните, что PowerShell может получить доступ к объектам .Net. Запуск запуска, предложенный Blair Conrad, может быть заменен вызовом WaitForInputIdle серверного процесса, чтобы вы знали, когда сервер готов к запуску клиента.

$sp = get-process server-application 
$sp.WaitForInputIdle() 

Вы также можете использовать Process.Start, чтобы начать процесс и он возвращает точный процесс. Тогда вам не нужен процесс get.

$sp = [diagnostics.process]::start("server-application", "params") 
$sp.WaitForInputIdle() 
$cp = [diagnostics.process]::start("client-application", "params") 
0

Ждать 10 секунд между запуском приложений, попробуйте

launch-server-application serverparam1 serverparam2 ... 
Start-Sleep -s 10 
launch-client-application clientparam1 clientparam2 clientparam3 ... 

Если вы хотите, чтобы создать сценарий и имеют аргументы, переданные в, создайте файл под названием runlinkedapps.ps1 (или любой другой), с этим содержимым:

launch-server-application $args[0] $args[1] 
Start-Sleep -s 10 
launch-client-application $args[2] $args[3] $args[4] 

Или, однако, вы решили распространять параметры сервера и клиента в строке, используемой для запуска runlinkedapps.ps1. Если вы хотите, вы могли бы даже задержать задержку здесь, а не hardcoding 10.

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

1

@Lars Truijens предложил

Помните, что PowerShell может получить доступ к объектов .Net. В начале-сна как , предложенном Блэром Конрадом, может быть заменен на вызов WaitForInputIdle серверного процесса, так что вы знаете, когда сервер готов до запуска клиента.

Это более элегантный, чем спальный, для фиксированного (или поставленного через параметр) количества времени. Тем не менее, WaitForInputIdle

относится только к процессам с интерфейсом пользователя и, следовательно, цикл обработки сообщений .

поэтому это может не сработать, в зависимости от характеристик запуска-сервера-приложения.Однако, как указывал мне Ларс, вопрос касался окна (которое я пропустил, когда прочитал вопрос), поэтому его решение, вероятно, лучше всего.

+0

Да, вы правы. Однако из-за того, что в заявленных заявленных приложениях я предположил, что это так. – 2008-09-08 13:39:57