Назад | Перейти на главную страницу

Почему PsExec зависает после успешного выполнения сценария PowerShell?

Сценарий довольно прост. Просто пытается запустить кучу служб Windows. Выполнение локально на целевой машине работает нормально. Сценарий на самом деле также отлично работает, когда выполняется через PsExec, он просто никогда не возвращается, пока я не нажму клавишу «Enter» в командной строке CMD. Это проблема, потому что это вызывается из TeamCity, и это заставляет агента зависать, ожидая возврата PsExec.

Я пробовал следующее:

Вот как я на самом деле называю psexec:

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

Независимо от того, что я делаю, он зависает, пока я не буду локально на командной строке. После того, как я нажму Enter, я получаю сообщение:

powershell exited on target with error code 0.

Я знаю, что ответ приходит поздно, он уже был бы вычислен, иначе он может быть полезен для будущих посетителей.

STDIN должен быть перенаправлен при выполнении powershell, чтобы иметь возможность выйти из зависания (здесь он ждет в STDIN). чтобы иметь возможность использовать -inputformat none

powershell -inputformat none -File powershell_script.ps1 буду работать.

Проверьте - https://connect.microsoft.com/PowerShell/feedback/details/572313/powershell-exe-can-hang-if-stdin-is-redirected

Оказывается, это обычная проблема. Нашел решение Вот. По сути, если вы передаете некоторые данные на stdin с помощью cmd, они вернутся должным образом после выполнения (потому что они запускаются через cmd, а не через powershell).

Пример:

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

Также устраняет проблему.

В -d флаг для psexec похоже на "запустить и выйти" в неинтерактивном режиме:

-d Не ждать завершения работы приложения.

Используйте только для неинтерактивных приложений.

Powershell не закрывается. Попробуйте эту командную строку

Powershell -command script.ps1

я бегал psexec со скриптом VBS и решением, отмеченным как лучшее (Пример: psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1") работал у меня только во время каждого третьего или около того пробега. Я копал и нашел описание каждого переключателя

Я решил попробовать «-s», и это каждый раз помогало мне. Вот мой пример:

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