从Python调用PowerShell脚本

时间:2011-08-01 17:00:39

标签: python powershell

我正在尝试从python启动PowerShell脚本,如下所示:

psxmlgen = subprocess.Popen([r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe',
                             './buildxml.ps1',
                             arg1, arg2, arg3], cwd=os.getcwd())
result = psxmlgen.wait()

问题是我收到以下错误:

  

文件   C:\ Users \用户sztomi \工作空间\ MyProject的\ buildxml.ps1   无法加载,因为在此处禁用了脚本的执行   系统。有关详细信息,请参阅“get-help about_signing”。

尽管我在很久以前通过在管理员运行的PS终端中键入Set-ExecutionPolicy Unrestriced来确实在Powershell中启用了运行脚本的事实(并且再做一次,只是为了确保)。 powershell可执行文件与开始菜单中的快捷方式指向的相同。无论我是否以管理员身份运行PowerShell,Get-ExecutionPolicy都会正确报告Unrestricted

如何从Python正确执行PS脚本?

2 个答案:

答案 0 :(得分:16)

首先,Set-ExecutionPolicy Unrestriced基于每个用户,基于每位(32位不同于64位)。

其次,您可以从命令行覆盖执行策略。

psxmlgen = subprocess.Popen([r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe',
                             '-ExecutionPolicy',
                             'Unrestricted',
                             './buildxml.ps1',
                             arg1, arg2, arg3], cwd=os.getcwd())
result = psxmlgen.wait()

显然,您可以使用此路径从32位PowerShell访问64位PowerShell(感谢评论中的@eryksun):

powershell64 = os.path.join(os.environ['SystemRoot'], 
    'SysNative' if platform.architecture()[0] == '32bit' else 'System32',
    'WindowsPowerShell', 'v1.0', 'powershell.exe')

答案 1 :(得分:0)

对于我们这些想知道如何在传递给powershell之后显示arg1,arg2和arg3的值的人,你需要做的就是:

Write-Host $args[0]
Write-Host $args[1]
Write-Host $args[2]