¿Por qué se cuelga PsExec después de ejecutar con éxito un script de PowerShell?

12

El guión es bastante sencillo. Simplemente intenta iniciar un montón de servicios de Windows. La ejecución localmente funciona bien cuando está en la máquina de destino. El script también se está ejecutando bien cuando se realiza a través de PsExec, simplemente nunca regresa hasta que presiono la tecla "enter" en mi indicador CMD. Esto es un problema, porque se está llamando desde TeamCity y hace que el Agente se cuelgue esperando que PsExec regrese.

He intentado lo siguiente:

  • Agregar un exity exit 0al final del script Powershell
  • Agregar < NULa al final de la llamada PsExec, según la respuesta en esta pregunta de SF
  • Agregar una >redirección stdout

Así es como en realidad estoy llamando psexec:

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

No importa lo que haga, se bloquea hasta que localmente en el indicador de cmd. Después de presionar enter, recibo el mensaje:

powershell exited on target with error code 0.
Mate
fuente

Respuestas:

11

Resulta que este es un problema común. Encontré la solución aquí . Esencialmente, si canaliza algunos datos en stdin con cmd, devolverá correctamente después de la ejecución (porque se ejecuta a través de cmd, no de PowerShell).

Ejemplo:

psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1"
Mate
fuente
¿está configurado como Línea de comando - Script personalizado o Línea de comando - Ejecutable (en TeamCity)?
Wojtek Turowicz
OK. Lo configuré como ejecutable y me ayudó. Gracias amigo, he pasado 1 día diagnosticando. ¡Difundir la palabra!
Wojtek Turowicz
Después de un día, el problema volvió ...
Wojtek Turowicz
11

Sé que la respuesta llega tarde, ya se habría resuelto, de lo contrario, podría ser útil para futuros visitantes.

STDIN tiene que ser redirigido en orden de ejecución de PowerShell para poder venir de Hang (Aquí espera en STDIN). para poder hacer esto use -inputformat none

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

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

Venfah Nazir
fuente
Esto no solo funciona, sino que también explica por qué funciona la respuesta aceptada. ¡Gracias!
jpaugh
5
psexec \\target -u domain\username -p password -d powershell c:\path\script.ps1

También soluciona el problema.

La -dbandera para psexec es como "ejecutar y salir" de una manera no interactiva:

-d No espere a que la aplicación finalice.

Solo se usa para aplicaciones no interactivas.

riogezz
fuente
0

Powershell no está saliendo. Prueba esta línea de comando

Powershell -command script.ps1
uSlackr
fuente
0

Estaba ejecutando psexeccon el script VBS y la solución marcada como la mejor (EX:) psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1"funcionaba para mí solo durante cada 3ª ejecución. Seguí cavando y encontré la descripción de cada interruptor

Decidí probar "-s" y eso fue lo que funcionó para mí cada vez. Aquí está mi ejemplo:

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