Posso correre bene:
$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" start-process $msbuild -wait
Ma quando eseguo questo codice (sotto) ottengo un errore:
$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.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: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ MSBuild.exe / v: q / nologo
su una linea di per sé, come viene gestito in PowerShell?
Dovrei usare qualche tipo di funzione eval () invece?
hai intenzione di voler separare i tuoi argomenti in parametri separati
$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" $arguments = "/v:q /nologo" start-process $msbuild $arguments
Utilizzando parametri espliciti, sarebbe:
$msbuild = 'C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe' start-Process -FilePath $msbuild -ArgumentList '/v:q','/nologo'
MODIFICA: virgolette.
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 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 # Explorer viene utilizzato per aprire una finestra cmd.exe e PS viene eseguito da quella finestra, ignora anche la richiesta -Attenduto. 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
Ho trovato che usare cmd funziona bene come alternativa, specialmente quando è necessario redirect l’output dall’applicazione chiamata (specialmente quando non ha una registrazione integrata, a differenza di msbuild)
cmd /C "$msbuild $args" >> $outputfile
A meno che l’OP non stia utilizzando le estensioni della community di PowerShell che fornisce un cmdlet Start-Process e molti altri. Se questo è il caso, la soluzione di Glennular funziona bene dato che corrisponde ai parametri posizionali di pscx \ start-process: -path (posizione 1) -argomenti (posizione 2).