PowerShell – Switch di avvio processo e Cmdline

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).