从Python调用PowerShell脚本
我正在尝试从python启动PowerShell脚本,如下所示:从Python调用PowerShell脚本,python,powershell,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 = psxml
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\workspace\myproject\buildxml.ps1
无法加载,因为在此服务器上禁用了脚本的执行
系统。有关更多详细信息,请参阅“获取有关签名的帮助”
尽管我很久以前确实通过在管理员运行的PS终端中键入Set ExecutionPolicy unflicted
启用了在Powershell中运行脚本的功能(并且再次这样做,只是为了确保)。powershell可执行文件与“开始”菜单中的快捷方式指向的相同<代码>获取执行策略正确报告无限制
无论我是否以管理员身份运行PowerShell
如何从Python正确执行PS脚本?首先,
设置无限制的执行策略
是基于每个用户的,并且是基于每个位的(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):
对于我们这些希望知道如何在arg1、arg2和arg3的值传递到powershell后显示这些值的人,您只需执行以下操作:
Write-Host $args[0]
Write-Host $args[1]
Write-Host $args[2]
哇,太好了,谢谢你!事实上,我刚刚发现这个问题是由于Windows7x64臭名昭著的文件系统重定向造成的。(我在x64版本中有无限制策略,但在x86版本中没有,python也没有重定向到它)。我不完全确定如何使用子进程调用这样的可执行文件,但我只是想澄清,“/buildxml.ps1”是实际调用的命令吗?@someone或其他buildxml.ps1是powershell脚本文件和可执行文件(如果这就是您所说的命令)是
'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe'
。下面列表中的所有项目都是传递给此可执行文件的参数。因此,如果您想调用“ls”(这是一个示例,可以使用“dir”完成),您可以将其放入一个arg变量中?使用虚拟“SysNative”目录可从32位WOW64程序运行本机64位系统可执行文件。此外,不要硬编码系统根目录“C:\Windows”;Windows并不总是安装在该目录下。我会使用powershell64=os.path.join(os.environment['SystemRoot'],'SysNative'if platform.architecture()[0]=='32位'else'System32','WindowsPowerShell','v1.0','powershell.exe')
。
Write-Host $args[0]
Write-Host $args[1]
Write-Host $args[2]