PowerShell - Interruptores de inicio de proceso y línea de comandos
-
19-08-2019 - |
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?
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)
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).