Чому PsExec зависає після успішного запуску скрипта powerhell?


12

Сценарій досить прямо вперед. Просто намагається запустити купу сервісів Windows. Виконання локально працює нормально, коли на цільовій машині. Сценарій фактично виконується добре, коли це робиться через PsExec, він просто ніколи не повертається, поки я не натисну клавішу "Enter" у моєму запиті CMD. Це проблема, оскільки це викликається від TeamCity, і це змушує Агента зависнути в очікуванні повернення PsExec.

Я спробував таке:

  • Додавання exitта exit 0в кінці сценарію Powershell
  • Додаючи < 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.

Відповіді:


11

Виявляється, це поширена проблема. Знайшов рішення а тут . По суті, якщо ви передасте деякі дані на stdin з cmd, вони повернуться швидко після виконання (тому що він запускається через cmd, а не powerhell).

Приклад:

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

це налаштовано як командний рядок - спеціальний сценарій або командний рядок - виконуваний (в TeamCity)?
Войтек Турович

Гаразд Ive встановив його як виконуваний файл, і це допомогло. Спасибі, я витратив 1 день на діагностику. Поширювати Слово!
Войтек Турович

Через день проблема повернулася ...
Войтек Турович

11

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

STDIN має бути перенаправлений у виконанні повноважень в повному порядку, щоб мати змогу прийти з вішання (ось він чекає в 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


Це не тільки працює, але й пояснює, чому працює прийнята відповідь. Спасибі!
jpaugh

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

Також вирішує проблему.

-dПрапор для PsExec , як «запуск і вихід» в НЕ інтерактивному режимі:

-d Не чекайте припинення дії програми.

Використовувати лише для неінтерактивних програм.


0

Powershell не виходить. Спробуйте цей командний рядок

Powershell -command script.ps1

0

Я працював psexecіз сценарієм VBS, і рішення, позначене як найкраще (EX:), psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1"працювало на мене лише під час кожного 3-го запуску. Я продовжував копати і знайшов опис кожного вимикача

Я вирішив спробувати "-s", і те, що працювало для мене кожен раз, ось мій приклад:

call C:\psexec.exe %SERVER_NAME% -u %USERNAME% -p %PASSWORD% -h -s cscript %pathTomyVBSscript%
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.