Pourquoi PsExec se bloque-t-il après avoir exécuté avec succès un script PowerShell?

12

Le script est assez simple. Essaie simplement de démarrer un tas de services Windows. L'exécution fonctionne localement correctement sur la machine cible. Le script s'exécute également très bien lorsqu'il est effectué via PsExec, il ne revient jamais jusqu'à ce que j'appuie sur la touche "Entrée" de mon invite CMD. Il s'agit d'un problème, car cela est appelé à partir de TeamCity, et cela fait que l'agent se bloque en attendant le retour de PsExec.

J'ai essayé ce qui suit:

  • Ajout d'un exitet exit 0à la fin du script Powershell
  • Ajout d'un < NULà la fin de l'appel PsExec, selon la réponse à cette question SF
  • Ajout d'une >redirection stdout

Voici comment j'appelle réellement psexec:

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

Peu importe ce que je fais, il se bloque jusqu'à ce que je le localement sur l'invite cmd. Après avoir appuyé sur Entrée, je reçois le message:

powershell exited on target with error code 0.
Mat
la source

Réponses:

11

Il s'avère que c'est un problème courant. J'ai trouvé la solution ici . Essentiellement, si vous dirigez certaines données sur stdin avec cmd, elles seront renvoyées correctement après l'exécution (car elles sont exécutées via cmd, pas PowerShell).

Exemple:

psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1"
Mat
la source
est-il configuré comme ligne de commande - script personnalisé ou ligne de commande - exécutable (dans TeamCity)?
Wojtek Turowicz
OK, je l'ai configuré comme exécutable et cela a aidé. Merci mon pote, j'ai passé 1 jour à le diagnostiquer. Faire connaitre!
Wojtek Turowicz
Après une journée, le problème est revenu ...
Wojtek Turowicz
11

Je sais que la réponse arrive tard, elle aurait déjà été trouvée, sinon elle pourrait être utile pour les futurs visiteurs.

STDIN doit être redirigé dans l'exécution PowerShell afin de pouvoir provenir du blocage (Ici, il attend dans STDIN). pour pouvoir le faire, utilisez -inputformat none

powershell -inputformat none -File powershell_script.ps1 marchera.

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

Venfah Nazir
la source
Non seulement cela fonctionne, mais cela explique également pourquoi la réponse acceptée fonctionne. Merci!
jpaugh
5
psexec \\target -u domain\username -p password -d powershell c:\path\script.ps1

Résout également le problème.

Le -ddrapeau de psexec est comme "exécuter et quitter" de manière non interactive:

-d N'attendez pas la fin de l'application.

Utiliser uniquement pour les applications non interactives.

riogezz
la source
0

Powershell ne sort pas. Essayez cette ligne de commande

Powershell -command script.ps1
uSlackr
la source
0

Je courais psexecavec le script VBS et la solution marquée comme le meilleur (EX: psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1") travaille pour moi que pendant chaque 3ème ou si exécuter. Je continuais à creuser et j'ai trouvé la description de chaque interrupteur

J'ai décidé d'essayer "-s" et que ce qui a fonctionné pour moi à chaque fois Voici mon exemple:

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