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.
Matt
quelle

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"
Matt
quelle
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

Venfah Nazir
quelle
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.

Riogezz
quelle
0

Powershell wird nicht beendet. Versuchen Sie diese Befehlszeile

Powershell -command script.ps1
uSlackr
quelle
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%
Thomas
quelle