2017-01-11 23 views
0

Здесь мы можем видеть примеры: https://github.com/diyan/pywinrm как управлять окнами через pywinrm и Powershell скрипт это работа.не может запустить Powershell скрипт с pywinrm

но в случае

ps_script = """$strComputer = $Host 
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Python27\Scripts", [EnvironmentVariableTarget]::Machine) 
Restart-Computer 
""" 

это добавить питона в PATH, но не перезапустить Windows.

в случае

ps_script = """Write-Host "hello" 
    """ 

я вижу "привет" в терминале моей машины, а не удаленный.

что не так?

+0

Пара мыслей. Какую версию Windows вы пытаетесь перезапустить? С какой версией PowerShell? Если я правильно помню, Restart-Computer не добавлялся до PowerShell 3.0. Во-вторых, что произойдет, если вы добавите параметр '-force'? – BenH

+0

@BenH, «restart-computer -force» дают успех. Но какие права? Сервер Windows 2012, powershell 3.0 Мой пользователь уже находится в административной группе. – flow

+0

Собственно, 'Retart-Computer -Force' AFAIR просто игнорирует тот факт, что в удаленном окне есть сеансы. Если это произойдет, если какой-либо сеанс присутствует, PowerShell вернет ошибку. Проверьте 'std_err' вашего объекта' response', из которого вы получаете (просто угадывая, как вы пропустили эту часть вашего кода) метод 'run_ps'. – BartekB

ответ

0

Путь 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 бросает на вас молчать.

+0

Я пробовал это 'r = s.run_ps (ps_script) print (r.std_err)' и в терминале есть тишина – flow

 Смежные вопросы

  • Нет связанных вопросов^_^