在Python中,我们可以使用
subprocess
来本地运行
bat
(
cmd
)脚本,就像
import subprocess as sp
sp.run(["D:/Temp/hello.bat"])
工作得很好。但是,它无法本机运行
ps1
脚本,像
import subprocess as sp
sp.run(["D:/Temp/hello.ps1"])
这样的代码将导致引发“WinError 193: %1 不是有效的 Win32 应用程序”。
我认为这是因为
.PS1
尚未执行出现在
PATHEXT
并将其添加到那里,但我也尝试了
这个答案
中提供的方法,它似乎正在设置文件执行策略,但它仍然不起作用。|| |我知道当我在像
这样的调用中添加执行器或使用
sp.run(["pwsh", "D:/Temp/hello.ps1"])
脚本作为中间时,它会起作用,但这不是我所需要的,它从 *nix 移植到 Windows 的程序很糟糕。调用我作为单个可执行文件提供的任何内容(在 *nix 上我们可以使用 shebang,但不能在 Windows 上)。
bat
script as intermediate, but that's not desired. I am using a program which is badly ported from *nix to Windows and it just call whatever I provided as a single executable (on *nix we can use shebang, but not on windows).
你不能在没有指定执行器的情况下直接运行
.ps1
脚本。这是因为 Windows 与 Linux 不同,它不会根据 shebang 或文件扩展名自动确定如何执行文件。
.ps1
文件被专门设计为由 PowerShell 解释器执行。
虽然你不能直接运行
.ps1
文件,但可以探索以下替代方案:
1. 使用 Python 包装器:
创建一个简单的
.bat
文件,它调用 Python 解释器并传入你的
.ps1
脚本作为参数。例如,创建一个名为
run_ps1.bat
的文件,内容如下:
@echo off
python -c "import subprocess; subprocess.run(['powershell', '%~f0\..\%1'], shell=True)" %*
这个
.bat
文件可以接受
.ps1
文件的路径作为参数,并使用
powershell
命令执行它。你可以从你的 Python 代码中调用这个
.bat
文件。
2. 使用 Python 嵌入 PowerShell:
你可以使用
subprocess
模块在 Python 中直接嵌入 PowerShell 代码。例如:
import subprocess
powershell_code = """
# Your PowerShell code here
Write-Host "Hello from PowerShell!"
"""
subprocess.run(['powershell', '-Command', powershell_code])
这个方法允许你在 Python 代码中直接嵌入和执行 PowerShell 代码段。
3. 使用 Plumbum 库:
Plumbum 是一个 Python 库,它提供了更高级别的接口来处理 shell 命令和脚本。它可以简化 PowerShell 脚本的执行。
from plumbum import local
powershell = local["powershell"]
powershell("-File", "D:/Temp/hello.ps1")
请记住,这些方法仍然需要 PowerShell 安装在你的系统上。它们只是提供了一种更方便的方式,可以从 Python 代码中执行 PowerShell 脚本。
标签:python,powershell,cmd,subprocess From: 78804321