Путь pywinrm работы является:
- подключиться к WinRM в моде, подобной
winrs
команды на Windows,
- , когда вы решили запустить скрипт PowerShell - он преобразуется в формат, приемлемый по
powershell.exe -encodedCommand
(см линия, которая вызывает PowerShell в pywinrm code)
- Результат передается обратно в питона, так что вы можете
print
, или делать то, что вам нужно
Не знаете, что вы ожидаете от Write-Host
- это всего лишь командлет, который записывается в приложение, на котором размещается PowerShell (в случае pywinrm
- это будет PowerShell.exe
), и хозяин несет ответственность за его обработку - в вашем случае напишите его std_out
. Так что неудивительно, что он добрался до вашей консоли, я думаю.
Что касается перезагрузки компьютера - он имеет тенденцию к ошибке при наличии активных пользователей. Это сообщение будет в конечном итоге в std_err
из pywinrm кода - вы можете анализировать return_code
и реагировать в зависимости от значения:
session = Session(...)
result = session.run_ps(command)
print result.std_out
if result.status_code != 0:
print "Error: %s" % result.std_err
Я подозреваю, что ты ничего не делал с std_err
, поэтому любые ошибки PowerShell бросает на вас молчать.
Пара мыслей. Какую версию Windows вы пытаетесь перезапустить? С какой версией PowerShell? Если я правильно помню, Restart-Computer не добавлялся до PowerShell 3.0. Во-вторых, что произойдет, если вы добавите параметр '-force'? – BenH
@BenH, «restart-computer -force» дают успех. Но какие права? Сервер Windows 2012, powershell 3.0 Мой пользователь уже находится в административной группе. – flow
Собственно, 'Retart-Computer -Force' AFAIR просто игнорирует тот факт, что в удаленном окне есть сеансы. Если это произойдет, если какой-либо сеанс присутствует, PowerShell вернет ошибку. Проверьте 'std_err' вашего объекта' response', из которого вы получаете (просто угадывая, как вы пропустили эту часть вашего кода) метод 'run_ps'. – BartekB