编译NSIS安装程序时如何获取CMD应用程序的输出内容
NSIS获取命令行程序输出的解决方案
错误原因
你使用!system指令拿到的${MYOUTPUT}实际是命令的退出码,返回0代表cmdapp.exe运行正常,并不是程序打印到控制台的标准输出内容,这是NSIS编译期!system指令的默认行为。
编译期获取输出方案
如果你的需求是在NSIS脚本编译阶段就拿到cmdapp.exe的输出结果,可以将输出重定向到临时文件再读取:
; 将命令行输出重定向到临时文件 !system '.\cmdapp.exe > "%TEMP%\cmdapp_output.tmp"' ; 读取临时文件内容到自定义变量 !file_read "%TEMP%\cmdapp_output.tmp" MYOUTPUT ; 用完删除临时文件 !delfile "%TEMP%\cmdapp_output.tmp" ; 此时即可正常弹出输出内容 MessageBox MB_ICONINFORMATION "${MYOUTPUT}"
安装运行期获取输出方案
如果你的需求是在用户运行安装包的过程中执行cmdapp.exe并获取输出,需要使用NSIS自带的nsExec插件实现:
; 执行命令并将结果存入栈中 nsExec::ExecToStack '$EXEDIR\cmdapp.exe' Pop $0 ; 第一个弹出的是命令退出码 Pop $1 ; 第二个弹出的是命令标准输出 MessageBox MB_ICONINFORMATION "命令输出:$1$\n退出码:$0"
注意事项
- 编译期读取输出时,如果输出内容包含多行,可自行处理换行符或截断逻辑
- 运行期调用外部程序时,建议使用绝对路径定位程序,避免路径找不到的问题
- 若输出内容包含NSIS保留的特殊字符,需提前做转义处理,避免脚本解析错误
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

