如何在Meson.Build中正常运行PowerShell脚本pkg_gen.ps1?
核心问题原因
Windows 环境下 .ps1 文件不是系统原生可执行程序,无法像 Linux/macOS 的 shell 脚本那样被直接加载执行,必须通过 PowerShell 解释器显式调用,这也是原有配置仅在非 Windows 环境下能正常运行、Windows 下执行失败的根本原因。
调整后的配置方案
1. 修改 scripts 目录下的 meson.build
在 Windows 分支下,不再直接把 ps1 文件路径赋值给 pkg_gen 变量,而是预先组装好完整的 PowerShell 调用链(包含解释器、必要执行参数、脚本路径),非 Windows 环境保持原有逻辑不变:
if is_windows # 自动在系统 PATH 中定位 PowerShell 解释器,找不到直接终止配置 powershell = find_program('powershell.exe', required : true) # 组装调用序列:解释器 + 临时绕过本地执行策略的参数 + 待运行脚本 pkg_gen = [ powershell, '-ExecutionPolicy', 'Bypass', '-File', files('pkg_gen.ps1') ] else # 非 Windows 环境沿用原有逻辑,直接指向带执行权限的 shell 脚本 pkg_gen = files('pkg_gen.sh') endif wheel_gen = files('wheel_gen.py')
这里加入的
-ExecutionPolicy Bypass参数仅对当前单次 PowerShell 进程生效,不会修改系统全局的脚本执行限制,是运行本地未签名 ps1 脚本最安全的方式,可避免默认 Restricted 策略下的权限报错。
2. 项目根目录 meson.build 无需额外调整
原有 run_target 配置可完全兼容调整后的 pkg_gen 变量:
run_target('package',command:[pkg_gen, python3.path()])
因为 Meson 会自动扁平化嵌套的命令列表,Windows 环境下最终生成的实际执行命令为:
<powershell.exe 路径> -ExecutionPolicy Bypass -File <pkg_gen.ps1 路径> <python3 可执行文件路径>
非 Windows 环境下生成的命令和原有逻辑完全一致,无兼容性变化。
3. 配置生效与验证
修改完成后需要重新加载配置,让 Meson 识别新的定义:
meson setup <你的构建目录> --reconfigure
之后执行打包命令即可正常触发 PowerShell 脚本:
meson compile package
常见注意事项
- 不要硬编码
powershell.exe的绝对路径(比如写死 System32 下的路径),用find_program定位可兼容不同 Windows 版本、不同安装位置的环境。 - 如果需要使用跨平台的 PowerShell 7(即
pwsh.exe),只需要把find_program里的程序名改成pwsh.exe即可,配置逻辑完全通用。 - 若 ps1 脚本存在中文乱码问题,需要确认脚本文件保存为带 BOM 的 UTF-8 编码,这是 Windows PowerShell 5.x 版本的默认编码识别规则,和 Meson 配置无关。
内容的提问来源于stack exchange,提问作者Robert Schneider
相关产品推荐
相关产品推荐

