So führen Sie Powershell-Befehle sequenziell aus

So führen Sie Powershell-Befehle sequenziell aus

Ich habe einige Befehle, die nur mit dem Präfix ausgeführt werden können &.

Sie laufen alle asynchron.

Beispielskript:

& 'C:\Program Files\SomeApp\SomeAppUninstall.exe'/silent
& 'C:\Users\bob\Downloads\SomeApp.exe' /silent
& 'C:\Program Files\someApp.exe' /openGui

Was hier passiert, ist, dass der letzte Befehl zuerst ausgeführt wird, da er am schnellsten ist und das Programm noch installiert ist. Die ersten beiden werden gleichzeitig ausgeführt, was zu einem Konflikt führt.

Ich muss sie offensichtlich nacheinander ausführen.

Aus irgendeinem Grund funktionieren diese Befehle nur, wenn ihnen das vorangestellt ist, &oder ich erhalte eine Fehlermeldung. Ich vermute, das liegt daran, dass sie Schalter haben.

Wie kann ich das umgehen?

Antwort1

Vor einigen Jahren habe ich eine Powershell-Funktion geschrieben, weil ich die gleiche oder zumindest eine ähnliche Anforderung hatte wie Sie. Wenn ich mich recht erinnere, hat mir diese Funktion gute Dienste geleistet – obwohl ich glaube, dass ich einmal auf ein Problem gestoßen bin, das ich nicht erklären konnte. Die Verwendung erfolgt also auf eigene Gefahr.

function wait-for-process {
   param (
     [string] $exe,
     [string] $arguments
   )

  $process                     = new-object System.Diagnostics.Process
  $process.StartInfo           = new-object System.Diagnostics.ProcessStartInfo
  $process.StartInfo.FileName  = $exe
  $process.StartInfo.Arguments = $arguments

  if (-not $process.Start()) {
    "Could not start $exe $arguments!"
     return
  }
  $process.WaitForExit()
  
  if ($process.ExitCode) {
    "Exit code for $exe $arguments is $($process.ExitCode)"
  }

}

Antwort2

Das von mir angegebene Beispiel war sehr einfach. Die tatsächlichen Fälle sind etwas komplexer, aber in meinen Fällen wird alle nur ein Argument verwendet.

Ich habe diese einfache Funktion geschrieben:

function Await($path, $arg) {
    Start-Process     `
      -Wait           `      
      -FilePath $path `
      -ArgumentList /$arg 
}

verwandte Informationen