web-dev-qa-db-fra.com

Pourquoi Psexec est-il suspendu après avoir exécuté avec succès un script PowerShell?

Le script est assez simple en avant. Essaie simplement de démarrer un groupe de services Windows. L'exécution fonctionne localement bien lorsque sur la machine cible. Le script exécute effectivement une amende aussi bien lorsqu'il est fait via Psexec, il ne revient jamais que si je n'apporte que la touche "Entrée" de mon invite CMD. C'est un problème, car cela est appelé à partir de TeamCity et que l'agent pendentif en attendant que PSExec revienne.

J'ai essayé ce qui suit:

  • Ajouter un exit et exit 0 à la fin du script PowerShell
  • Ajouter un < NUL à la fin de l'appel Psexec, par la réponse dans cette question SF
  • Ajouter un > stdout redirect

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 soit localement sur l'invite CMD. Après avoir frappé Entrée, je reçois le message:

powershell exited on target with error code 0.
12
Matt

S'avère que ceci est un problème courant. Trouvé la solution a ici . Essentiellement, si vous conduisez certaines données sur STDIN avec CMD, cela reviendra bien après l'exécution (car elle est exécutée via CMD, pas PowerShell).

Exemple:

psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1"
11
Matt

Je sais que la réponse arrive en retard Cela aurait déjà été déterminée, sinon cela pourrait être utile pour les futurs visiteurs.

STDIN doit être ré-dirigé dans l'exécution de PowerShell Inoorder pour pouvoir venir de suspension (ici elle attend à STDIN). être capable de faire cette utilisation -Inputformat aucun

powershell -inputformat none -File powershell_script.ps1 marchera.

Chèque - https://connect.microsoft.com/powershell/feedback/details/572313/powershell-exe-can-hang-if-stdin-is-redraected

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

Corrige également le problème.

Les -d drapeau pour psexec est comme "Exécuter et sortir" de manière non interactive:

-D N'attendez pas que l'application se termine.

Utilisation uniquement pour les applications non interactives.

5
riogezz

PowerShell ne sort pas. Essayez cette ligne de commande

Powershell -command script.ps1
0
uSlackr

J'étais en cours d'exécution psexec avec 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") travaillait pour moi seulement pendant chaque 3ème ou deux fois. Je continuais à creuser et j'ai trouvé Description de chaque commutateur

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

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