Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Python调用PowerShell脚本_Python_Powershell - Fatal编程技术网

从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

我正在尝试从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\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]