Ich kann das gut laufen lassen:
$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe"
start-process $msbuild -wait
Aber wenn ich diesen Code (unten) ausführe, erhalte ich eine Fehlermeldung:
$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /v:q /nologo"
start-process $msbuild -wait
Gibt es eine Möglichkeit, Parameter über den Startprozess an MSBuild zu übergeben? Ich bin offen dafür, den Startprozess nicht zu verwenden. Der einzige Grund, warum ich ihn verwendet habe, war, dass ich den "Befehl" als Variable haben musste.
Wie wird das in Powershell gehandhabt, wenn ich
C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ MSBuild.exe / v: q / nologo
in einer eigenen Zeile habe?
Sollte ich stattdessen eine eval () -Funktion verwenden?
command-line
powershell
start-process
BuddyJoe
quelle
quelle
Antworten:
Sie möchten Ihre Argumente in separate Parameter unterteilen
$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" $arguments = "/v:q /nologo" start-process $msbuild $arguments
quelle
$args
Da ein Variablenname nicht funktioniert, ist er reserviert. Verwenden Sie$arguments
oder irgendetwas anderes stattdessen-ArgumentList
nach Zeichenfolgen gesucht wird. Das Beispiel für eine andere Antwort mit durch Kommas getrennten Zeichenfolgen (technisch gesehen ein Array) funktioniert möglicherweise, weil PowerShell sie möglicherweise abrollt, aber wenn ja Wenn Sie eine Argumentliste aus einem Array übergeben möchten, ist es wahrscheinlich am besten, sie vorher in einen String zu "entpacken".get-help start-process
gibt an, dass -ArgumentList erwartetString[]
Mit expliziten Parametern wäre es:
$msbuild = 'C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe' start-Process -FilePath $msbuild -ArgumentList '/v:q','/nologo'
EDIT: Anführungszeichen.
quelle
-ArgumentList ('/v:q','/nologo')
git gui &
- wie einfach ist das (* nix natürlich)! Im Vergleich zustart-Process git -ArgumentList gui
. Ich weiß, ich weiß, nicht hilfreich. Ich habe in letzter Zeit ein bisschen mit Powershell gespielt und viele schöne Dinge; aber die Ausführlichkeit ist ein Killer!sajb { git gui }
Warnung
Wenn Sie PowerShell in einem von Powershell erstellten cmd.exe-Fenster ausführen, wartet die zweite Instanz nicht mehr auf den Abschluss von Jobs.
cmd> PowerShell PS> Start-Process cmd.exe -Wait
Führen Sie nun im neuen cmd-Fenster PowerShell erneut aus und starten Sie darin ein zweites cmd-Fenster: cmd2> PowerShell
PS> Start-Process cmd.exe -Wait PS>
Die zweite Instanz von PowerShell berücksichtigt die Warteanforderung nicht mehr und ALLE Hintergrundprozesse / Jobs geben den Status "Abgeschlossen" zurück, auch wenn sie noch ausgeführt werden!
Ich habe dies festgestellt, als mein C # Explorer-Programm zum Öffnen eines cmd.exe-Fensters verwendet wird und PS in diesem Fenster ausgeführt wird. Außerdem wird die -Wait-Anforderung ignoriert. Es scheint, dass jede PowerShell, bei der es sich um einen 'win32-Job' von cmd.exe handelt, die Warteanforderung nicht erfüllt.
Ich bin mit PowerShell Version 3.0 unter Windows 7 / x64 darauf gestoßen
quelle
Ich habe festgestellt, dass die Verwendung von cmd als Alternative gut funktioniert, insbesondere wenn Sie die Ausgabe der aufgerufenen Anwendung weiterleiten müssen (insbesondere, wenn im Gegensatz zu msbuild keine integrierte Protokollierung vorhanden ist).
cmd /C "$msbuild $args" >> $outputfile
quelle
Es sei denn, das OP verwendet PowerShell Community Extensions, die zusammen mit einer Reihe anderer ein Start-Process-Cmdlet bereitstellen. Wenn dies der Fall ist, ist Glennulars Lösung eine Wohltat, da sie mit den Positionsparametern von pscx \ start-process übereinstimmt: -path (Position 1) -arguments (Position 2).
quelle