Domanda

Posso eseguire questo bene:

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" 
start-process $msbuild -wait

Ma quando eseguo questo codice (sotto) ricevo un errore:

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /v:q /nologo" 
start-process $msbuild -wait

Esiste un modo per passare i parametri a MSBuild usando il processo di avvio? Sono aperto a non utilizzare il processo di avvio, l'unica ragione per cui l'ho usato era che dovevo avere il comando "quot" come variabile.

Quando ho
C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ MSBuild.exe / v: q / nologo
da solo, come viene gestito in Powershell?

Dovrei usare invece qualche tipo di funzione eval ()?

È stato utile?

Soluzione

vorrai separare i tuoi argomenti in un parametro separato

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe"
$arguments = "/v:q /nologo"
start-process $msbuild $arguments 

Altri suggerimenti

Utilizzando parametri espliciti, sarebbe:

$msbuild = 'C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe'
start-Process -FilePath $msbuild -ArgumentList '/v:q','/nologo'

EDIT: virgolette.

Avviso

Se si esegue PowerShell da una finestra 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, esegui nuovamente PowerShell e al suo interno avvia 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!

Ho scoperto questo quando il mio programma C # Explorer viene utilizzato per aprire una finestra cmd.exe e PS viene eseguito da quella finestra, inoltre ignora la richiesta -Attendi. Sembra che qualsiasi PowerShell che sia 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 reindirizzare l'output dall'applicazione chiamata (soprattutto quando non ha il log incorporato, a differenza di msbuild)

cmd / C " $ msbuild $ args " & Gt; > $ Outputfile

A meno che l'OP non stia utilizzando le estensioni della community di PowerShell che forniscono un cmdlet Start-Process insieme a molti altri. In questo caso, la soluzione di Glennular funziona a meraviglia poiché corrisponde ai parametri posizionali di pscx \ start-process: -path (posizione 1) -arguments (positon 2).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top