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

12

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

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

  • Добавление exitи exit 0в конце скрипта Powershell
  • Добавление a < NULв конец вызова PsExec согласно ответу на этот вопрос SF
  • Добавление >перенаправления stdout

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

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

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

powershell exited on target with error code 0.
Matt
источник

Ответы:

11

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

Пример:

psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1"
Matt
источник
это установлено как Командная строка - Пользовательский скрипт или Командная строка - Исполняемый (в TeamCity)?
Войтек Турович
ОК, я настроил его как исполняемый файл, и это помогло. Спасибо, приятель, я потратил 1 день на диагностику. Распространить слово!
Войтек Турович
Через день проблема вернулась ...
Войтек Турович
11

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

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

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

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

Венфа Назир
источник
Это не только работает, но и объясняет, почему принятый ответ работает. Благодарность!
jpaugh
5
psexec \\target -u domain\username -p password -d powershell c:\path\script.ps1

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

-dФлаг для PsExec , как «запуск и выход» в не интерактивном режиме:

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

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

riogezz
источник
0

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

Powershell -command script.ps1
uSlackr
источник
0

Я работал psexecсо сценарием VBS, и решение, помеченное как лучшее (EX:), 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%
Томас
источник