PowerShell - Start-Processo e CmdLine Switches
-
19-08-2019 - |
Pergunta
Eu posso correr esse bem:
$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe"
start-process $msbuild -wait
Mas quando eu executar esse código (abaixo) eu recebo um erro:
$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /v:q /nologo"
start-process $msbuild -wait
Existe uma maneira que eu posso passar parâmetros para MSBuild usando start-processo? Estou aberto a não usar start-processo, a única razão que eu usei era que eu precisava para ter o "comando" como uma variável.
Quando tenho
C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ MSBuild.exe / v: q / nologo
em uma linha por si só, como é que se tratada de PowerShell?
Eu deveria estar usando algum tipo de eval () tipo de função em vez disso?
Solução
você vai querer separar seus argumentos em parâmetro separado
$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe"
$arguments = "/v:q /nologo"
start-process $msbuild $arguments
Outras dicas
Usando parâmetros explícitos, seria:
$msbuild = 'C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe'
start-Process -FilePath $msbuild -ArgumentList '/v:q','/nologo'
EDIT:. Citações
Atenção
Se você executar PowerShell de uma janela cmd.exe criado por PowerShell, a 2ª instância espera há mais tempo para trabalhos para completar.
cmd> PowerShell
PS> Start-Process cmd.exe -Wait
Agora, a partir da nova janela cmd, execute PowerShell novamente e dentro dele iniciar uma janela de 2 cmd: cmd2> PowerShell
PS> Start-Process cmd.exe -Wait
PS>
O status 2ª instância PowerShell honras já não o pedido Espere e processo de fundo ALL / empregos voltar 'Concluído' tu mesmo que eles ainda estão em execução!
Eu descobri isso quando meu programa C # Explorer é usado para abrir uma janela cmd.exe e PS é executado a partir dessa janela, ele também ignora o pedido Espere. Parece que qualquer PowerShell que é um 'trabalho win32' do cmd.exe não honrar a solicitação de espera.
Eu corri para isso com PowerShell versão 3.0 no Windows 7 / x64
eu encontrei usando cmd funciona bem como uma alternativa, especialmente quando você precisa canalizar a saída do aplicativo chamado (espeically quando não têm construído em logging, ao contrário msbuild)
cmd /C "$msbuild $args" >> $outputfile
A menos que o OP está usando PowerShell Community Extensions que fornece um cmdlet Start-Process junto com um monte de outros. Se este o caso, então a solução da Glennular funciona um tratamento, uma vez que coincide com os parâmetros de posição de pscx \ start-processo:. -Caminho (posição 1) -arguments (positon 2)