Windows下Inno Setup安装时无法找到node.msi及nssm.exe文件
Inno Setup安装时找不到node.msi和nssm.exe的解决办法
问题现象
接手的Inno Setup脚本可正常生成安装包,但安装过程中提示找不到node-v20.10.0-x64.msi和nssm.exe文件,调整文件存放目录后问题依旧。
核心原因与解决步骤
1. 移除external标记(最常见问题)
脚本中[Files]段的external标记表示不将文件打包进安装包,仅在安装时从本地源路径读取。如果安装包单独分发,用户机器上没有对应路径的文件,必然报错。
修改[Files]段:
[Files] Source: "../server/*"; DestDir: "{app}\server"; Flags: ignoreversion recursesubdirs createallsubdirs; Excludes: "node_modules\.bin" Source: "../client/build/*"; DestDir: "C:\inetpub\wwwroot"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "web.config"; DestDir: "C:\inetpub\wwwroot"; Flags: ignoreversion ; 移除external标记,将文件打包进安装包 Source: "node-v20.10.0-x64.msi"; DestDir: "{app}"; Flags: ignoreversion Source: "nssm.exe"; DestDir: "{app}"; Flags: ignoreversion ; NOTE: Don't use "Flags: ignoreversion" on any shared system files
2. 验证预处理器变量定义
脚本中使用了{#NODE}和{#NSSM}变量,需确保脚本开头已正确定义这些变量,且文件名与实际文件完全一致:
#define MyAppShortName "你的服务名称" # 替换为实际服务名 #define NODE "node-v20.10.0-x64.msi" #define NSSM "nssm.exe"
3. 确认编译时源文件路径正确
Source: "node-v20.10.0-x64.msi"是相对路径,编译时该文件必须放在Inno Setup脚本所在目录(或对应相对路径下)。如果编译时文件不在指定位置,即使移除external标记,文件也不会被打包进安装包,安装时仍会找不到。
4. 解决权限问题
{app}默认指向Program Files目录,普通用户安装时可能无写入权限,导致文件无法复制到目标路径。可在[Setup]段添加管理员权限要求:
[Setup] PrivilegesRequired=admin
修改后的完整[Run]段示例
[Run] Filename: "{sys}\msiexec.exe"; Parameters: "/passive /i ""{app}\{#NODE}"""; Filename: "{sys}\netsh.exe"; Parameters: "advfirewall firewall add rule name=""Node In"" program=""{commonpf64}\nodejs\node.exe"" dir=in action=allow enable=yes"; Flags: runhidden; Filename: "{sys}\netsh.exe"; Parameters: "advfirewall firewall add rule name=""Node Out"" program=""{commonpf64}\nodejs\node.exe"" dir=out action=allow enable=yes"; Flags: runhidden; Filename: "{app}\{#NSSM}"; Parameters: "install {#MyAppShortName} ""{commonpf64}\nodejs\node.exe"" "; Flags: runhidden; Filename: "{app}\{#NSSM}"; Parameters: "set {#MyAppShortName} AppDirectory ""{app}\server"" "; Flags: runhidden; Filename: "{app}\{#NSSM}"; Parameters: "set {#MyAppShortName} AppParameters ""index.js"" "; Flags: runhidden; Filename: "{app}\{#NSSM}"; Parameters: "set {#MyAppShortName} AppStdout ""{app}\logs\stdout.log"" "; Flags: runhidden; Filename: "{app}\{#NSSM}"; Parameters: "set {#MyAppShortName} AppStderr ""{app}\logs\stderr.log"" "; Flags: runhidden; Filename: "{sys}\net.exe"; Parameters: "start {#MyAppShortName}"; Flags: runhidden;
内容的提问来源于stack exchange,提问作者Terje Nygård
相关产品推荐
相关产品推荐

