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

Почему мой сценарий PowerShell зависает при вызове в PSEXEC через пакетный файл (.cmd)?

Я пытаюсь удаленно выполнить сценарий PowerShell, используя PSEXEC. Сценарий PowerShell вызывается через .cmd командный файл. Причина, по которой мы это делаем, заключается в том, чтобы изменить политику выполнения, запустить сценарий PowerShell, а затем снова сбросить политику выполнения:

На удаленном сервере do-tasks.cmd выглядит как:

powershell -command "&{ set-executionpolicy unrestricted}"  
powershell DoTasks.ps1  
powershell -command "&{ set-executionpolicy restricted}"  

Скрипт PowerShell DoTasks.ps1 просто делает это сейчас:

Write-Output "Hello World!"

Оба этих скрипта живут в c:\windows\system32 (пока) просто так, что они находятся в ПУТИ.

На исходном сервере я делаю следующее:

psexec \\web1928 -u administrator -p "adminpassword" do-tasks.cmd

Когда это запускается, я получаю следующий ответ в командной строке:

c:\Windows\system32>powershell -command "&{ set-executionpolicy unrestricted}"

и сценарий больше не запускается.

Я не могу нажать Ctrl-C, чтобы сломать сценарий, и я просто вижу символы ^ C, я могу вводить ввод с клавиатуры, и символы выводятся на консоль.

На удаленном сервере я вижу, что PowerShell.exe и CMD.exe запущены на вкладке «Процесс» диспетчера задач. Если я завершу эти процессы, управление вернется в командную строку на исходном сервере.

Я пробовал это с помощью простого .cmd командный файл с @echo hello world и он отлично работает.

Бег do-tasks.cmd на удаленном сервере через сеанс RDP тоже работает нормально.

Исходный сервер работает под управлением Windows 2003 SP2, удаленный сервер работает под управлением Windows 2008 SP2.

Почему мой удаленный командный файл зависает при выполнении через PSEXEC?

Это обычная проблема с POSH. Проблема в stdin зависает. Попробуй это:

c:\Windows\system32>powershell -command "&{ set-executionpolicy unrestricted}" < NUL

Большинство ответов на форумах решают эту проблему с помощью обходного пути, такого как эхо и конвейер, чтобы Powershell получал некоторые данные от STDIN.

Но в PowerShell есть решение. Просто запустите powershell с параметром -inputformat none like:

powershell -inputformat none -command ...

Это решает проблему зависания с помощью psexec для Win2003 и Win2008.

Поскольку сервер работает под управлением 2k8, я подозреваю, что UAC вызывает проблемы. Я бы также предложил использовать winrm вместо psexec. Удаленное взаимодействие Powershell было одной из лучших новых функций powershell 2.0