Friday 26 May 2017

Waitforexit In Powershell


Normalerweise wartet PowerShell für interne Befehle, bevor der nächste Befehl gestartet wird. Eine Ausnahme von dieser Regel ist externe Windows-Subsystem-basierte EXE. Der erste Trick ist, Pipeline zu Out-Null wie folgt: PowerShell wartet, bis der Notepad. exe-Prozess beendet wurde, bevor Sie fortfahren. Das ist nett, aber Art von subtil, abholen vom Lesen des Codes. Sie können auch Start-Prozess mit dem Parameter - Wait: Wenn Sie die PowerShell Community-Erweiterungen Version ist es: Eine weitere Option in PowerShell 2.0 ist es, einen Hintergrundjob zu verwenden: ty ifree, ich habe testcomplete auf diese Weise ausgeführt habe ich verwendet Ich habe eine Anführungszeichenfolge in der Liste der durch Leerzeichen getrennten Argumente.1 aber jetzt echo exitcodefalse, die mein returncode aus dem Prozeß nicht war exit_Code Diagnostics. Process :: Start (quotc: Programmdateien (x86) SmartBearTestComplete 10BinTestComplete. exequot, 39quotc: UsersMEDocumentsTestComplete 10 Projectshig4TestProject1hig4TestProject1. Pjsquot run project: myProjtest: quotKeywordTestszTdd1Goodquot exit39).WaitForExit (60) ndash AnneTheAgile Jan 21 15 am 14:15 Inklusive der Option - NoNewWindow gibt mir einen Fehler: Start-Prozess. Dieser Befehl kann aufgrund des Fehlers nicht ausgeführt werden: Zugriff verweigert. Der einzige Weg, den ich bekommen konnte, war, zu rufen: Verwalten von Prozessen in PowerShell Einige Leute haben vor kurzem gefragt, wie man 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 auf den Win32-Prozess warten möchte In cmd. exe, you8217d tun dies mit 8220start wait8221 aber dieser Befehl ist nicht (direkt) in PowerShell verfügbar. 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 eine Wartezeit zu tun, indem Sie 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