Por que o PsExec fica travado depois de executar com sucesso um script do PowerShell?

11

O script é bastante direto. Simplesmente tenta iniciar um monte de serviços do Windows. Execução localmente funciona bem quando na máquina de destino. O script está realmente funcionando bem quando feito via PsExec, ele nunca retorna até que eu pressione a tecla "enter" no prompt do CMD. Isso é um problema, porque isso está sendo chamado pelo TeamCity e faz o agente ficar esperando que o PsExec retorne.

Eu tentei o seguinte:

  • Adicionando um exit e exit 0 no final do script do Powershell
  • Adicionando um < NUL ao final da chamada PsExec, conforme a resposta em esta pergunta do SF
  • Adicionando um redirecionamento > stdout

É assim que estou realmente ligando para o 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 o localmente no prompt do cmd. Depois que eu apertei enter, recebi a mensagem:

powershell exited on target with error code 0.
    
por Matt 11.10.2012 / 23:14

5 respostas

11

Acontece que este é um problema comum. Encontrou a solução aqui . Essencialmente, se você canalizar alguns dados em stdin com cmd, ele retornará adequadamente após a execução (porque está sendo executado via cmd, não powershell).

Exemplo:

psexec \target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1"
    
por 11.10.2012 / 23:22
10

Sei que a resposta chegará atrasada, já teria sido descoberta. Se não, pode ser útil para futuros visitantes.

STDIN tem que ser redirecionado na execução do powershell para poder vir do hang (Aqui aguarda em STDIN). para ser capaz de fazer isso use -inputformat nenhum

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

Verifique - link

    
por 23.10.2014 / 07:00
3
psexec \target -u domain\username -p password -d powershell c:\path\script.ps1

Também corrige o problema.

A -d flag para psexec é como "executar e sair" de uma forma não interativa:

-d Don’t wait for the application to terminate.

Only use for non-interactive applications.

    
por 01.03.2016 / 14:13
0

O Powershell não está saindo. Tente esta linha de comando

Powershell -command script.ps1
    
por 12.10.2012 / 03:21
0

Eu estava executando psexec com o script 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 durante cada 3 ou mais execuções. Continuei pesquisando e achei a descrição de cada opção

Eu decidi tentar "-s" e 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%
    
por 03.09.2018 / 10:12