Dlaczego PsExec zawiesza się po pomyślnym uruchomieniu skryptu PowerShell?


12

Skrypt jest dość prosty. Po prostu próbuje uruchomić kilka usług Windows. Wykonanie lokalne działa poprawnie na komputerze docelowym. Skrypt faktycznie działa dobrze, gdy jest wykonywany za pomocą PsExec, po prostu nigdy nie wraca, dopóki nie naciśniesz klawisza „enter” w wierszu polecenia CMD. Jest to problem, ponieważ jest wywoływany z TeamCity i powoduje, że agent zawiesza się i czeka na powrót PsExec.

Próbowałem następujące:

  • Dodanie exiti exit 0na końcu skryptu Powershell
  • Dodanie a < NULna końcu wywołania PsExec, zgodnie z odpowiedzią na to pytanie SF
  • Dodanie >przekierowania standardowego

Właśnie tak nazywam psexec:

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

Bez względu na to, co robię, zawiesza się, dopóki nie lokalnie w wierszu polecenia cmd. Po wciśnięciu Enter otrzymuję komunikat:

powershell exited on target with error code 0.

Odpowiedzi:


11

Okazuje się, że jest to powszechny problem. Znaleziono rozwiązanie a tutaj . Zasadniczo, jeśli potokujesz jakieś dane na stdin za pomocą cmd, to zwróci ono odpowiednio po wykonaniu (ponieważ jest uruchamiane przez cmd, a nie PowerShell).

Przykład:

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

czy jest ustawiony jako Wiersz polecenia - Skrypt niestandardowy lub Wiersz polecenia - Plik wykonywalny (w TeamCity)?
Wojtek Turowicz,

OK Ustawiłem go jako plik wykonywalny i pomogło. Dzięki kolego spędziłem 1 dzień diagnozując to. Rozgłosić!
Wojtek Turowicz,

Po dniu problem powrócił ...
Wojtek Turowicz

11

Wiem, że odpowiedź spóźnia się, już by się domyśliła. Jeśli nie, może być przydatna dla przyszłych gości.

STDIN musi zostać przekierowany w celu wykonania PowerShell, aby mógł pochodzić z zawieszenia (tutaj czeka w STDIN). aby móc to zrobić, użyj -inputformat none

powershell -inputformat none -File powershell_script.ps1 będzie działać.

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


To nie tylko działa, ale także wyjaśnia, dlaczego działa zaakceptowana odpowiedź. Dzięki!
jpaugh

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

Naprawia także problem.

-dFlaga dla PsExec jest jak „w biegu i zjazd” w nieinterakcyjnym sposób:

-d Nie czekaj na zakończenie działania aplikacji.

Używaj tylko do aplikacji nieinteraktywnych.


0

PowerShell nie wychodzi. Wypróbuj ten wiersz poleceń

Powershell -command script.ps1

0

Biegałam psexecze skryptu VBS i roztwór oznaczony jako najlepszy (np psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1") pracował dla mnie tylko podczas każdego 3 lub tak zaniedbany. Kopałem dalej i znalazłem opis każdego przełącznika

Postanowiłem spróbować „-s” i to, co działało dla mnie za każdym razem Oto mój przykład:

call C:\psexec.exe %SERVER_NAME% -u %USERNAME% -p %PASSWORD% -h -s cscript %pathTomyVBSscript%
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.