Por que o PsExec trava depois de executar com êxito um script do PowerShell?

12

O script é bastante direto. Simplesmente tenta iniciar um monte de serviços do Windows. A execução localmente funciona bem quando está na máquina de destino. Na verdade, o script também está executando bem quando feito via PsExec, mas nunca retorna até que eu pressione a tecla "enter" no prompt do meu CMD. Isso é um problema, porque está sendo chamado pelo TeamCity e faz com que o Agente espere aguardando o retorno do PsExec.

Eu tentei o seguinte:

  • Adicionando exite exit 0no final do script Powershell
  • Adicionando < NULa ao final da chamada PsExec, de acordo com a resposta nesta pergunta do SF
  • Adicionando um >redirecionamento stdout

É assim que estou chamando psexec:

psexec \\target -u domain\username -p password powershell c:\path\script.ps1

Não importa o que eu faça, ele trava até que eu localmente no prompt do cmd. Depois de pressionar enter, recebo a mensagem:

powershell exited on target with error code 0.
Matt
fonte

Respostas:

11

Acontece que este é um problema comum. Encontrei a solução aqui . Essencialmente, se você canalizar alguns dados no stdin com o cmd, eles retornarão apropriadamente após a execução (porque estão sendo executados via cmd, não pelo PowerShell).

Exemplo:

psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1"
Matt
fonte
está configurado como linha de comando - script personalizado ou linha de comando - executável (no TeamCity)?
Wojtek Turowicz
OK, configurei como executável e ajudou. Obrigado companheiro, passei 1 dia diagnosticando. Espalhe a palavra!
Wojtek Turowicz
Depois de um dia, o problema retornou ...
Wojtek Turowicz
11

Sei que a resposta chega tarde, já teria sido descoberto. Caso contrário, pode ser útil para futuros visitantes.

O STDIN deve ser redirecionado na execução do PowerShell para poder sair do modo de espera (Aqui espera no STDIN). para poder fazer isso, use -inputformat none

powershell -inputformat none -File powershell_script.ps1 vai funcionar.

Verifique - https://connect.microsoft.com/PowerShell/feedback/details/572313/powershell-exe-can-hang-if-stdin-is-redirected

Venfah Nazir
fonte
Isso não apenas funciona, mas também explica por que a resposta aceita funciona. Obrigado!
jpaugh
5
psexec \\target -u domain\username -p password -d powershell c:\path\script.ps1

Também corrige o problema.

O -dsinalizador para psexec é como "executar e sair" de uma maneira não interativa:

-d Não espere o aplicativo terminar.

Use apenas para aplicativos não interativos.

riogezz
fonte
0

O PowerShell não está saindo. Experimente esta linha de comando

Powershell -command script.ps1
uSlackr
fonte
0

Eu estava executando o psexecscript VBS e a solução marcada como a melhor (EX:) psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1"estava funcionando para mim apenas a cada 3ª execução. Eu continuava cavando e encontrei a descrição de cada chave

Eu decidi tentar "-s" e que o que funcionou para mim todas as vezes Aqui está o meu exemplo:

call C:\psexec.exe %SERVER_NAME% -u %USERNAME% -p %PASSWORD% -h -s cscript %pathTomyVBSscript%
Thomas
fonte