Posso correre bene:
$msbuild = "C:WINDOWSMicrosoft.NETFrameworkv3.5MSBuild.exe"
start-process $msbuild -wait
Ma quando eseguo questo codice (sotto) ottengo un errore:
$msbuild = "C:WINDOWSMicrosoft.NETFrameworkv3.5MSBuild.exe /v:q /nologo"
start-process $msbuild -wait
C'è un modo in cui posso passare i parametri a MSBuild usando start-process? Sono aperto a non usare il processo di avvio, l'unica ragione per cui l'ho usato è stato che dovevo avere il "comando" come variabile.
Quando ho
C: WINDOWSMicrosoft.NETFrameworkv3.5MSBuild.exe / v: q / nologo
su una linea di per sé, come viene gestito in PowerShell?
Dovrei usare qualche tipo di funzione eval () invece?
risposte:
97 per risposta № 1hai intenzione di voler separare i tuoi argomenti in parametri separati
$msbuild = "C:WINDOWSMicrosoft.NETFrameworkv3.5MSBuild.exe"
$arguments = "/v:q /nologo"
start-process $msbuild $arguments
44 per risposta № 2
Utilizzando parametri espliciti, sarebbe:
$msbuild = "C:WINDOWSMicrosoft.NETFrameworkv3.5MSBuild.exe"
start-Process -FilePath $msbuild -ArgumentList "/v:q","/nologo"
MODIFICA: virgolette.
7 per risposta № 3
avvertimento
Se si esegue PowerShell da una finestra di cmd.exe creata da Powershell, la seconda istanza non attende più il completamento dei lavori.
cmd> PowerShell
PS> Start-Process cmd.exe -Wait
Ora dalla nuova finestra di cmd, eseguire di nuovo PowerShell e al suo interno avviare una seconda finestra cmd: cmd2> PowerShell
PS> Start-Process cmd.exe -Wait
PS>
La seconda istanza di PowerShell non rispetta più la richiesta -Wait e TUTTI i processi / processi in background restituiscono lo stato "Completato" anche se sono ancora in esecuzione!
L'ho scoperto quando è il mio programma C # Explorerusato per aprire una finestra cmd.exe e PS viene eseguito da quella finestra, ignora anche la richiesta -Attendi. Sembra che qualsiasi PowerShell che è un "lavoro win32" di cmd.exe non rispetti la richiesta di attesa.
Mi sono imbattuto in questo con PowerShell versione 3.0 su Windows 7 / x64
5 per risposta № 4
Ho trovato che usare cmd funziona bene come alternativa, specialmente quando è necessario reindirizzare l'output dall'applicazione chiamata (specialmente quando non ha incorporato la registrazione, diversamente da msbuild)
cmd /C "$msbuild $args" >> $outputfile
1 per risposta № 5
A meno che l'OP non usi la Comunità PowerShellEstensioni che forniscono un cmdlet Start-Process insieme ad altri. Se questo è il caso, la soluzione di Glennular funziona bene dato che corrisponde ai parametri posizionali del processo pscxstart: -path (posizione 1) -argomenti (posizione 2).