在Python外部执行PowerShell脚本

时间:2017-05-28 15:45:01

标签: python powershell subprocess

我正在尝试运行一种利用Python和PowerShell脚本的应用程序。我已经编写了Python脚本和powershell脚本,它们可以同时工作但彼此分开。我想要做的是创建一个启动它们的Python程序,有没有办法?谢谢! 作为更大的脚本的一部分,我现在所拥有的是:

import subprocess
autom = r"C:\Users\mrmostacho\Desktop\Robot\Autom.ps1","-ExecutionPolicy","Unrestricted"
powershell = r"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
subprocess.Popen("%s %s" % (powershell, autom,))

1 个答案:

答案 0 :(得分:1)

我认为您不希望"-ExecutionPolicy","Unrestricted"作为脚本参数,而是想要设置powershells执行策略以允许执行您的脚本。因此,您应该在实际脚本之前传递这些参数。

第二:将脚本作为参数传递给powershell.exe是不够的(这样脚本名称被解释为Powershell命令,并且必须根据powershells引用规则来逃避名称)。而是应在-File参数之后给出脚本名称。来自online documentation

  

-File []

     

在本地范围内运行指定的脚本(" dot-sourced"),以便脚本创建的函数和变量是   在当前会话中可用。输入脚本文件路径和任何   参数。文件必须是命令中的最后一个参数,因为   File参数名称后面的所有字符都被解释为   脚本文件路径后跟脚本参数。

     

您可以在其中包含脚本参数和参数值   File参数的值。例如:-File .\Get-Script.ps1 -Domain Central

     

通常,脚本的开关参数包含或包含   省略。例如,以下命令使用All参数   Get-Script.ps1脚本文件:-File .\Get-Script.ps1 -All

     

在极少数情况下,您可能需要为交换机提供布尔值   参数。为。中的switch参数提供布尔值   File参数的值,将参数名称和值括起来   大括号,例如:-File .\Get-Script.ps1 {-All:$False}

第三:正如cdarke已经评论过,最好使用列表而不是字符串作为Popen的参数。这样就不用担心Windows上的CommandLine parsing

总而言之,这应该是要走的路。 (用小测试脚本测试。)

import subprocess
autom = r"C:\Users\mrmostacho\Desktop\Robot\Autom.ps1"
powershell = r"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
subprocess.Popen([powershell,"-ExecutionPolicy","Unrestricted","-File", autom])

如果您需要将参数传递给脚本,请执行以下操作:

subprocess.Popen([powershell,"-ExecutionPolicy","Unrestricted","-File", autom, 'arg 1', 'arg 2'])