2008-09-08 7 views
5

Stellen Sie sich eine DOS-Formatdatei (.cmd) vor, die zum Starten interdependenter Fensteranwendungen in der richtigen Reihenfolge verwendet wird.Erstellen von Stapeljobs in PowerShell

Beispiel:
1) Starten Sie eine Serveranwendung, indem Sie eine exe mit Parametern aufrufen.
2) Warten Sie, bis der Server initialisiert wurde (oder eine bestimmte Zeit).
3) Starten Sie die Client-Anwendung, indem Sie eine exe mit Parametern aufrufen.

Was ist der einfachste Weg, um diese Art von Batch-Job in PowerShell zu erreichen?

Antwort

5

Denken Sie daran, dass PowerShell kann auf .Net-Objekte zugreifen. Der von Blair Conrad vorgeschlagene Start-Sleep-Modus kann durch einen Aufruf des Serverprozesses an WaitForInputIdle ersetzt werden, sodass Sie wissen, wann der Server bereit ist, bevor der Client gestartet wird.

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

Sie könnten auch Process.Start, um den Prozess zu starten und haben es den genauen Prozess zurückzukehren. Dann brauchst du den get-Prozess nicht.

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

bis 10 Sekunden warten zwischen den Anwendungen startet, versuchen

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

Wenn Sie ein Skript erstellen möchten und haben die übergebenen Argumente, eine Datei namens runlinkedapps.ps1 erstellen (oder was auch immer) mit diesen Inhalten:

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

Oder wie auch immer Sie die Server- und Client-Parameter in der Zeile verteilen, die Sie zum Ausführen von runlinkedapps.ps1 verwenden. Wenn Sie möchten, könnten Sie hier sogar die Verzögerung einbringen, anstattfest zu codieren.

Denken Sie daran, dass sich Ihre .ps1-Datei auf Ihrem Pfad befinden muss, oder Sie müssen den Speicherort angeben, wenn Sie sie ausführen. (Oh, und ich habe angenommen, dass Start-Server-Anwendung und Start-Client-Anwendung auf Ihrem Pfad sind - wenn nicht, müssen Sie auch den vollständigen Pfad zu ihnen angeben.)

1

@ Lars Truijens vorgeschlagen

Denken Sie daran, dass Powershell .NET-Objekte zugreifen können. Der von Blair Conrad vorgeschlagene Start-Sleep als kann durch einen Aufruf von WaitForInputIdle des Serverprozesses ersetzt werden, so dass Sie wissen, wenn der Server bereit ist, bevor Sie den Client starten.

Dies ist eleganter als das Schlafen für eine feste (oder über Parameter) Zeit. Jedoch WaitForInputIdle

gilt nur für Prozesse mit einer Benutzerschnittstelle und daher eine Nachricht Schleife.

Dies funktioniert möglicherweise nicht, abhängig von den Eigenschaften der Start-Server-Anwendung.Wie Lars jedoch darauf hingewiesen hat, bezog sich die Frage auf eine gefensterte Anwendung (die ich beim Lesen der Frage vermisste), so dass seine Lösung wohl am besten ist.

+0

Ja, Sie haben Recht. Da die Frage jedoch Fensteranwendungen betrifft, nahm ich an, dass dies der Fall ist. –

+0

Ausgezeichneter Punkt, Lars. Ich habe das als "Windows" gelesen. Hoppla. Dennoch kann es für jemanden nützliche Informationen sein, manchmal ... –

+0

Wenn der Prozess, den Sie starten, ein Befehlszeilenprozess ist, können Sie $ sp.WaitForExit() verwenden –

Verwandte Themen