2008-09-08 11 views
5

Imagine un archivo .cmd de estilo de DOS que se utiliza para iniciar aplicaciones de ventanas interdependientes en el orden correcto.Creación de trabajos por lotes en PowerShell

Ejemplo:
1) Inicie una aplicación de servidor llamando a un exe con parámetros.
2) Espere a que el servidor se inicialice (o una cantidad de tiempo fija).
3) Inicie la aplicación cliente llamando a un exe con parámetros.

¿Cuál es la forma más simple de lograr este tipo de trabajo por lotes en PowerShell?

Respuesta

5

Recuerde que PowerShell puede acceder a objetos .Net. Start-Sleep como se sugiere en Blair Conrad se puede reemplazar por una llamada al WaitForInputIdle del proceso del servidor para saber cuándo el servidor está listo antes de iniciar el cliente.

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

También es posible usar Process.Start para iniciar el proceso y tienen que devolver el proceso exacto. Entonces no necesitas el proceso de obtención.

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

que esperar 10 segundos entre el lanzamiento de las aplicaciones, intente

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

Si desea crear un guión y tienen los argumentos pasados, crear un archivo llamado runlinkedapps.ps1 (o lo que sea) con estos contenidos:

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

O embargo decide distribuir los parámetros de servidor y cliente en la línea se utiliza para ejecutar runlinkedapps.ps1. Si lo desea, incluso puede pasar la demora aquí, en lugar de la codificación rígida 10.

Recuerde, su archivo .ps1 debe estar en su ruta, o tendrá que especificar su ubicación cuando lo ejecute. (Ah, y he asumido que las aplicaciones launch-server-application y launch-client-están en su Path; si no, también deberá especificar la ruta completa).

1

@Lars Truijens sugirió

Recuerde que PowerShell puede acceder objetos .NET. Start-Sleep como sugerido por Blair Conrad puede reemplazarse por llamando al WaitForInputIdle del proceso del servidor para saber cuándo el servidor está listo antes de iniciar el cliente.

Esto es más elegante que dormir durante un tiempo fijo (o suministrado por parámetro). Sin embargo, WaitForInputIdle

se aplica únicamente a los procesos con una interfaz de usuario y, por lo tanto, un bucle de mensajes .

por lo que es posible que esto no funcione, dependiendo de las características de launch-server-application.Sin embargo, como Lars me señaló, la pregunta se refería a una solicitud con ventana de (que me perdí cuando leí la pregunta), por lo que su solución es probablemente la mejor.

+0

Sí, tienes razón. Sin embargo, debido a que la pregunta decía aplicaciones en ventana, asumí que este es el caso. –

+0

Excelente punto, Lars. Lo leí como "Windows". Oops. Aún así, puede ser información útil para alguien, en algún momento ... –

+0

Si el proceso que está iniciando es un proceso de línea de comandos, puede usar $ sp.WaitForExit() –

Cuestiones relacionadas