我正在尝试运行一种利用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,))
答案 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'])