Pregunta

Puedo ejecutar esto bien:

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

Pero cuando ejecuto este código (a continuación) aparece un error:

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

¿Hay alguna manera de pasar parámetros a MSBuild usando start-process? Estoy abierto a no usar el proceso de inicio, la única razón por la que lo usé fue porque necesitaba tener el " comando " como una variable.

Cuando tengo
C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ MSBuild.exe / v: q / nologo
en una línea en sí misma, ¿cómo se maneja eso en Powershell?

¿Debería usar algún tipo de función eval () en su lugar?

¿Fue útil?

Solución

vas a querer separar tus argumentos en parámetros separados

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

Otros consejos

Usando parámetros explícitos, sería:

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

EDITAR: comillas.

Advertencia

Si ejecuta PowerShell desde una ventana cmd.exe creada por Powershell, la segunda instancia ya no espera a que se completen los trabajos.

cmd>  PowerShell
PS> Start-Process cmd.exe -Wait 

Ahora desde la nueva ventana de cmd, ejecute PowerShell nuevamente y dentro de él inicie una segunda ventana de cmd: cmd2 > PowerShell

PS> Start-Process cmd.exe -Wait
PS>   

¡La segunda instancia de PowerShell ya no cumple con la solicitud -Wait y TODOS los procesos / trabajos en segundo plano devuelven el estado 'Completado' incluso cuando todavía se están ejecutando!

Descubrí esto cuando mi programa C # Explorer se usa para abrir una ventana cmd.exe y PS se ejecuta desde esa ventana, también ignora la solicitud -Wait. Parece que cualquier PowerShell que sea un 'trabajo win32' de cmd.exe no cumple con la solicitud de espera.

Me encontré con esto con PowerShell versión 3.0 en Windows 7 / x64

He descubierto que usar cmd funciona bien como una alternativa, especialmente cuando necesita canalizar la salida de la aplicación llamada (especialmente cuando no tiene un registro incorporado, a diferencia de msbuild)

cmd / C " $ msbuild $ args " > > $ outputfile

A menos que el OP esté utilizando PowerShell Community Extensions, que proporciona un cmdlet Start-Process junto con muchos otros. Si este es el caso, la solución de Glennular funciona de maravilla ya que coincide con los parámetros posicionales de pscx \ start-process: -path (posición 1) -argumentos (positon 2).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top