无法使用pywinrm运行powershell脚本

时间:2017-01-11 12:39:50

标签: powershell python-2.x winrm

在这里我们可以看到例子: https://github.com/diyan/pywinrm 如何通过pywinrm和powershell脚本控制窗口 它的工作。

但是以防万一

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

它将python添加到PATH,但不要重新启动Windows。

以防

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

我看到"你好"在我的机器的终端,而不是远程。

出了什么问题?

1 个答案:

答案 0 :(得分:0)

pywinrm的工作方式是:

  • 以类似于Windows上的winrs命令的方式连接到WinRM
  • 当您决定运行PowerShell脚本时 - 它已转换为powershell.exe -encodedCommand可接受的格式(请参阅pywinrm code中调用PowerShell的行)
  • 结果转回python,这样你可以print,或做任何你需要的事情

不确定您对Write-Host的期望是什么 - 它只是一个cmdlet写入托管PowerShell的应用程序(如果是pywinrm - 那将是PowerShell.exe)并且主机是负责处理它 - 在你的情况下,把它写到std_out。因此,我猜它到达你的控制台并不奇怪。

关于Restart-Computer - 当有活跃用户时,它往往会出错。该消息将以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向你投掷的任何错误都保持沉默。