Monday 27 November 2017

Start Prozess Waitforexit Powershell


Ich versuche, ein Programm von PowerShell auszuführen, für den Ausgang warten, dann erhalten Sie Zugriff auf den ExitCode, aber nicht viel Glück. Ich möchte nicht - Wait mit Start-Prozess, wie ich einige Verarbeitung, um im Hintergrund zu tragen brauchen. Heres ein vereinfachtes Testskript: Wenn Sie dieses Skript ausführen, wird der Notizblock gestartet. Nachdem dieser manuell geschlossen wurde, wird der Exit-Code ausgedruckt, und er startet wieder ohne Verwendung von - wait. Kein ExitCode wird zur Verfügung gestellt, wenn dieses beendet wird: Ich muss in der Lage sein, eine zusätzliche Verarbeitung zwischen dem Starten des Programms und dem Warten auf es zu beenden ausführen, so kann ich nicht verwenden - Wait. Irgendeine Idee, wie ich dies tun kann und immer noch Zugriff auf die. ExitCode-Eigenschaft aus diesem Prozess gefragt werden Es gibt zwei Dinge, die hier erinnern. Eines ist, das - PassThru-Argument hinzuzufügen, und zwei ist das - Wait-Argument hinzuzufügen. Sie müssen wegen dieses Mangels die Warte Argument hinzuzufügen connect. microsoftPowerShellfeedbackdetails520554start-Prozess-tut-nicht-return-Exit-Wert-Eigenschaft Sobald Sie dies ein Prozess-Objekt tun zurückgeleitet wird, und Sie können die Exitcode-Eigenschaft des Objekts betrachten. Hier ist ein Beispiel: Wenn Sie es ohne - PassThru oder - Wait ausführen, wird es nothing. Managing Prozesse in Powershell drucken Mehrere Leute haben gefragt, vor kurzem darüber, wie Prozesse in Powershell zu verwalten. Dieser Blog-Beitrag sollte eine Reihe dieser Fragen beantworten. Wie man vom 8220shell8221 Teil von PowerShell erwarten könnte, müssen Sie nichts tun, um einen Prozess zu starten. In einer Programmiersprache wie VBScript, haben Sie etwas ziemlich komplex wie zu tun: strComputer 8220.8221 Set objWMIService GetObject (8220winmgmts: 8221 Ampere 8220 8221 Ampere strComputer amp 8220rootcimv28221) Set objStartup objWMIService. Get (8220Win32ProcessStartup8221) Set objConfig objStartup. SpawnInstance Set objProcess GetObject (8220winmgmts: rootcimv2: Win32Process8221) objProcess. Create 8220Notepad. exe8221, Null, objConfig, intProcessID aber in Schalen (Powershell, cmd. exe, bash, etc.) können Sie einfach ein Programm wie Notepad starten Sie einfach durch Eingabe einer 8220notepad8221 wie gezeigt. Jetzt bemerken Sie, dass, wenn Sie dies tun, die Shell sofort zurück und fordert für den nächsten Befehl. Dies liegt daran, Notizblock ist ein Win32-GUI-Prozess und läuft im Hintergrund. Auf der anderen Seite, wenn Sie eine Konsolenanwendung wie 8220ping. exe8221 starten, wird PowerShell warten, bis der Prozess abgeschlossen ist. Aber was, wenn ich für die Win32-Prozess in cmd. exe warten wollen, you8217d tun dies mit 8220start wait8221 aber dieser Befehl ist nicht (direkt) in Powershell. Also, was tun wir PowerShell direkt führt ausführbare Dateien. Wenn es wartet, bis der Prozess beendet wird, wird der Exit-Code in LASTEXITCODE verlassen. Wenn nun eine Win32-ausführbare Datei der letzte Befehl in einer Pipeline ist und nicht umgeleitet wird, wird der Prozess im Hintergrund ausgeführt. Allerdings, wenn Sie seine Ausgabe in etwas, dann PowerShell wird warten, bis der Befehl zu beenden So ist dies ein einfaches (wenn nicht intuitiv) warten, bis ein GUI-Prozess zu beenden warten. Wenn der Prozess bereits ausgeführt wird, können Sie Get-Process verwenden, um die erforderlichen Informationen zurückzuholen und dann ein WaitForExit () für dieses Objekt auszuführen. Hier ist ein etwas anspruchsvolleres Beispiel, wo wir ein Dokument öffnen statt einen Prozess zu starten. Dieses Mal finden wir den Prozess durch den Fenstertitel statt durch den ausführbaren Namen. Leider ist die Suche nach einem Prozess immer bedeutet, dass Sie den falschen Prozess finden können. Idealerweise möchten Sie das Process-Objekt direkt erhalten. Für eine genauere Prozessverwaltung müssen Sie also die Klasse System. Diagnostics. Process verwenden und die Prozesse selbst starten. Beispielsweise können Sie diagnosis. process :: Start () verwenden, um auf einen Prozess zu warten: Beachten Sie die Verwendung von 8220pwdfoo. txt8221, um den vollständigen Pfad zu der Datei anzugeben. Dies liegt daran, dass PowerShell seine eigene Idee des aktuellen Verzeichnisses verwaltet. (Dieser Hinweis gilt jede API zu verwenden, die das Dateisystem zugreift, müssen Sie es einen absoluten Pfad zu geben.) We8217re beginnen, nun wieder auf das Niveau der Komplexität, die Sie in einer Programmiersprache finden. Allerdings haben Sie auch alle die Macht der Sprachen. Hier8217s ein Beispiel-Skript 8220background. ps18221, mit dem Sie ein Skriptblock getrennt in einem separaten Fenster (oder im selben Fenster, wenn Sie den inconsole - Parameter angeben lassen) Dieses Skript let8217s Sie Dinge in PowerShell, die Sie can8217t tun können, von cmd. exe aber können Do aus VBScript. Schließlich sind hier zwei weitere Möglichkeiten, mit Prozessen zu arbeiten. Wenn PowerShell doesn8217t haben einen Startbefehl, cmd. exe tut, so können Sie einen Start Warten, indem Sie tun Und last but not least, die PowerShell Community Extensions umfasst Ein Start-Prozess-Cmdlets. Sie können eine Liste dieser Funktionen finden Sie unter: Bruce Payette MSFT

No comments:

Post a Comment