如何在Python中不指定执行器直接运行PowerShell(ps1)脚本?
在Python中直接用subprocess运行PowerShell脚本的解决方案
问题背景
在Python中使用subprocess可以直接运行.bat脚本:
import subprocess as sp sp.run(["D:/Temp/hello.bat"])
但直接调用.ps1脚本时会抛出WinError 193: %1 is not a valid Win32 application错误:
import subprocess as sp sp.run(["D:/Temp/hello.ps1"])
已尝试过添加.PS1到PATHEXT、修改PowerShell执行策略,均无效;也知道可以通过指定pwsh解释器或.bat中转解决,但因程序是从类Unix系统移植而来,仅支持调用单个可执行文件(类Unix依赖shebang机制,Windows无此特性),所以需要更贴合需求的方案。
解决步骤
核心是修改Windows的文件关联注册表,让系统自动用PowerShell解释器执行.ps1文件:
- 启动注册表编辑器(运行
regedit) - 定位到
HKEY_CLASSES_ROOT\.ps1,将默认值设为Microsoft.PowerShellScript.1 - 定位到
HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open\Command,把默认值修改为:
(若使用系统自带的PowerShell,路径替换为"C:\Program Files\PowerShell\7\pwsh.exe" "-File" "%1" %*C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe)
修改完成后,重启终端或刷新环境变量,再运行之前的Python代码即可正常执行.ps1脚本。
关键说明
PATHEXT仅控制系统查找可执行文件时的后缀优先级,无法解决“不知道用什么程序打开.ps1”的核心问题,所以单独修改它没用。- 执行策略是PowerShell的脚本运行权限控制,和
subprocess能否调用脚本文件本身无关,因此修改执行策略无法解决该错误。
内容的提问来源于stack exchange,提问作者ElevenLee
相关产品推荐
相关产品推荐

