Warum bleibt PsExec hängen, nachdem ein Powershell-Skript erfolgreich ausgeführt wurde?


11

Das Skript ist ziemlich einfach. Versucht einfach, eine Reihe von Windows-Diensten zu starten. Die lokale Ausführung funktioniert auf dem Zielcomputer einwandfrei. Das Skript wird auch über PsExec einwandfrei ausgeführt. Es wird nur dann zurückgegeben, wenn ich an meiner CMD-Eingabeaufforderung die Eingabetaste drücke. Dies ist ein Problem, da dies von TeamCity aufgerufen wird und der Agent hängen bleibt und auf die Rückkehr von PsExec wartet.

Ich habe folgendes versucht:

  • Hinzufügen eines exitund exit 0am Ende des Powershell-Skripts
  • Hinzufügen eines < NULam Ende des PsExec-Aufrufs gemäß der Antwort in dieser SF-Frage
  • Hinzufügen einer >Standardumleitung

So rufe ich eigentlich psexec an:

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

Egal was ich mache, es hängt bis ich lokal an der cmd Eingabeaufforderung bin. Nachdem ich die Eingabetaste gedrückt habe, wird folgende Meldung angezeigt:

powershell exited on target with error code 0.

Antworten:


11

Es stellt sich heraus, dass dies ein häufiges Problem ist. Hier die Lösung gefunden . Wenn Sie einige Daten auf stdin mit cmd weiterleiten, werden diese nach der Ausführung ordnungsgemäß zurückgegeben (da sie über cmd und nicht über Powershell ausgeführt werden).

Beispiel:

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

Ist es als Befehlszeile - Benutzerdefiniertes Skript oder Befehlszeile - Ausführbar (in TeamCity) eingerichtet?
— Wojtek Turowicz

OK, ich habe es als ausführbar eingerichtet und es hat geholfen. Danke Kumpel, ich habe 1 Tag damit verbracht, es zu diagnostizieren. Verbreite das Wort!
— Wojtek Turowicz

Nach einem Tag kehrte das Problem zurück ...
— Wojtek Turowicz

11

Ich weiß, dass die Antwort zu spät kommt und bereits herausgefunden worden wäre. Wenn nicht, könnte sie für zukünftige Besucher nützlich sein.

STDIN muss in der Powershell-Ausführung umgeleitet werden, um aus dem Hang kommen zu können (hier wartet es in STDIN). Um dies tun zu können, verwenden Sie -inputformat none

powershell -inputformat none -File powershell_script.ps1 wird funktionieren.

Überprüfen Sie - https://connect.microsoft.com/PowerShell/feedback/details/572313/powershell-exe-can-hang-if-stdin-is-redirected


Dies funktioniert nicht nur, sondern erklärt auch, warum die akzeptierte Antwort funktioniert. Vielen Dank!
— Jpaugh

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

Behebt auch das Problem.

Die -dFlagge für psexec ist auf nicht interaktive Weise wie "Ausführen und Beenden":

-d Warten Sie nicht, bis die Anwendung beendet ist.

Nur für nicht interaktive Anwendungen verwenden.


0

Powershell wird nicht beendet. Versuchen Sie diese Befehlszeile

Powershell -command script.ps1

0

Ich wurde psexecmit einem VBS-Skript ausgeführt und die als die beste (EX :) gekennzeichnete Lösung psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1"funktionierte nur bei jedem dritten Lauf für mich. Ich grub weiter und fand eine Beschreibung für jeden Schalter

Ich habe beschlossen, "-s" auszuprobieren und das, was jedes Mal für mich funktioniert hat. Hier ist mein Beispiel:

call C:\psexec.exe %SERVER_NAME% -u %USERNAME% -p %PASSWORD% -h -s cscript %pathTomyVBSscript%
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.