首页 > 编程问答 >运行“ps1”脚本而不指定执行器

运行“ps1”脚本而不指定执行器

时间:2024-07-29 03:46:21浏览次数:9  
标签:python powershell cmd subprocess

在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

相关文章