it-swarm.com.de

Wie kann PowerShell angewiesen werden, auf das Ende jedes Befehls zu warten, bevor der nächste Befehl gestartet wird?

Ich habe ein PowerShell 1.0-Skript zum Öffnen einer Reihe von Anwendungen. Die erste ist eine virtuelle Maschine und die anderen sind Entwicklungsanwendungen. Ich möchte, dass die virtuelle Maschine den Startvorgang beendet, bevor die restlichen Anwendungen geöffnet werden.

In Bash könnte ich einfach "cmd1 && cmd2" sagen

Das ist was ich habe ...

C:\Applications\VirtualBox\vboxmanage startvm superdooper
    &"C:\Applications\NetBeans 6.5\bin\netbeans.exe"
164
John Mee

Normalerweise wartet PowerShell für interne Befehle, bevor der nächste Befehl gestartet wird. Eine Ausnahme von dieser Regel ist eine externe, auf einem Windows-Subsystem basierende EXE-Datei. Der erste Trick besteht darin, wie folgt zu Out-Null zu pipeline:

Notepad.exe | Out-Null

PowerShell wartet, bis der Notepad.exe-Prozess beendet ist, bevor Sie fortfahren. Das ist schick, aber irgendwie subtil, wenn man den Code liest. Sie können Start-Process auch mit dem Parameter -Wait verwenden:

Start-Process <path to exe> -NoNewWindow -Wait

Wenn Sie die Version der PowerShell Community Extensions verwenden, gilt Folgendes:

$proc = Start-Process <path to exe> -NoWindow
$proc.WaitForExit()

Eine weitere Option in PowerShell 2.0 ist die Verwendung eines Hintergrundjobs:

$job = Start-Job { invoke command here }
Wait-Job $job
Receive-Job $job
295
Keith Hill

Neben der Verwendung von Start-Process -Wait wird Powershell durch das Piping der Ausgabe einer ausführbaren Datei gewartet. Je nach Bedarf werde ich normalerweise an Out-Null, Out-Default, Out-String oder Out-String -Stream weiterleiten. Here ist eine lange Liste einiger anderer Ausgabeoptionen. 

# Saving output as a string to a variable.
$output = ping.exe example.com | Out-String

# Filtering the output.
ping stackoverflow.com | where { $_ -match '^reply' }

# Using Start-Process affords the most control.
Start-Process -Wait SomeExecutable.com

Ich vermisse die CMD/Bash-Stiloperatoren, auf die Sie verwiesen haben (&, &&, ||). Es scheint, dass wir mehr mit Powershell ausführlicher sein müssen.

42
Nathan Hartley

Verwenden Sie einfach "Wait-Prozess":

"notepad","calc","wmplayer" | ForEach-Object {Start-Process $_} | Wait-Process ;dir

auftrag ist erledigt

11
Flaviofire

Einige Programme können den Ausgabestrom nicht sehr gut verarbeiten. Die Verwendung von pipe to Out-Null blockiert ihn möglicherweise nicht.
Und Start-Process benötigt den -ArgumentList-Schalter, um Argumente zu übergeben, nicht so bequem.
Es gibt auch einen anderen Ansatz. 

$exitCode = [Diagnostics.Process]::Start(<process>,<arguments>).WaitForExit(<timeout>)
5
ifree

Wenn Sie Start-Process <path to exe> -NoNewWindow -Wait verwenden

Sie können auch die Option -PassThru verwenden, um die Ausgabe zu bestätigen.

5
Sandy Chapman

Einschließlich der Option -NoNewWindow wird ein Fehler angezeigt: Start-Process : This command cannot be executed due to the error: Access is denied.

Die einzige Möglichkeit, wie ich es schaffen konnte, war zu rufen:

Start-Process <path to exe> -Wait
2
twasbrillig

Wenn Sie es weiterführen, könnten Sie sogar spontan parsen

z.B.

& "my.exe" | %{
    if ($_ -match 'OK')
    { Write-Host $_ -f Green }
    else if ($_ -match 'FAIL|ERROR')
    { Write-Host $_ -f Red }
    else 
    { Write-Host $_ }
}
0
Justin