You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Inno Setup中Pascal Script用相对路径调用PowerShell脚本失败原因

问题根因

你遇到的是Inno Setup编译期路径规则和运行时工作目录不匹配的问题,核心原因有两个:

  • 你在预编译器定义的#define path "..\functions\test.ps1"只是普通的字符串替换逻辑,预编译器不会自动把相对路径转为全路径,最终{#path}会被直接替换为..\functions\test.ps1这个字符串传入执行命令。
  • Inno Setup编译生成的安装包运行时,Exec函数的默认工作目录是系统临时目录(不是你当初存放example.iss的E:\source\installer目录,也不是安装包所在的目录),PowerShell拿到相对路径后会在临时目录下查找对应文件,自然找不到目标脚本,所以没有执行效果。

你测试的将脚本放到当前目录用.\test.ps1调用也无效,原因也是一样:你认知里的「当前目录」和安装程序实际运行的工作目录不一致。

解决方案

根据你的使用场景可以二选一:

  • 场景1:test.ps1只在编译环境存在,不需要打包进安装包
    直接用预编译器提供的CompilerPath变量把相对路径转成编译时的绝对路径即可,修改define写法:
    #define path CompilerPath + "..\functions\test.ps1"
    
    编译时{#path}会自动替换为E:\source\functions\test.ps1全路径,运行时不会有路径解析问题。
  • 场景2:test.ps1需要打包进安装包,在用户环境运行时执行
    先在[Files]段把脚本添加到安装包,设置释放到临时目录,调用Exec时手动指定工作目录为临时目录:
    [Files]
    Source: "..\functions\test.ps1"; DestDir: "{tmp}"; Flags: deleteafterinstall
    
    [Code]
    var 
        ResultCode : Integer;
    function PrepareToInstall(var NeedsRestart: Boolean): String;
        begin
            // 第三个参数指定工作目录为临时目录
            Exec('cmd', '/C powershell.exe -ExecutionPolicy bypass -File ".\test.ps1"', ExpandConstant('{tmp}'), SW_SHOW, 
                    ewWaitUntilTerminated, ResultCode);
        end
    
调试技巧

如果后续遇到类似路径问题,可以在PowerShell脚本开头添加一行Get-Location | Out-File "C:\debug_path.txt",运行安装包后打开这个文件就能看到脚本执行时的实际工作目录,方便定位问题。

内容的提问来源于stack exchange,提问作者Wayne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:39:03