【问题标题】:Executing Batch File in NSIS installer在 NSIS 安装程序中执行批处理文件
【发布时间】:2011-03-16 23:03:47
【问题描述】:

我有一个需要在 NSIS 安装程序中运行的批处理文件。它必须在提取完所有文件后运行,(我想这很明显,否则批处理文件将不存在)。

我尝试将 MUI_PAGE_CUSTOMFUNCTION_PRE 与完成页面一起使用以运行它,但是当它到达脚本的该部分时,它似乎直接跳过了它。下面是我如何调用它。

;;Finish Page
!define MUI_PAGE_CUSTOMFUNCTION_PRE Done
!insertmacro MUI_PAGE_FINISH

Function Done
    ExecWait '"$INSTDIR\BatchFile" "$INSTDIR" "$DATA_FOLDER"'
FunctionEnd

提前感谢您的帮助。

更新

我现在尝试使用以下方法:

ExpandEnvStrings $0 %COMSPEC% 
ExecWait '"$0" /C "$INSTDIR\batch.bat" "$INSTDIR" "$DATA_FOLDER"'

这不起作用,所以我拿出 /C 看看 cmd 提示符在说什么(它正在弹出,但立即关闭),似乎它执行了 cmd.exe 但仅此而已,它没有t 完成其余的执行。

更新 #2

可以在这里找到使我能够使用它的核心知识:

Windows batch files: .bat vs .cmd?

无论出于何种原因,.bat 文件都与 ExecWait 不一致。

最后:

ExecWait '"$INSTDIR\BatchFile.cmd" "$INSTDIR" "$DATA_FOLDER"'

工作得很好。

【问题讨论】:

  • 我能够运行 .bat 文件,就像您在上面发布的 cmd 文件一样。您还可以使用 nsExec::Exec 而不是 ExecWait 来禁止显示命令窗口。

标签: batch-file nsis


【解决方案1】:

Exec[Wait] 需要正确引用:

ExpandEnvStrings $0 %COMSPEC%
ExecWait '"$0" /C "c:\path\to\batch.cmd" "quoted param" normalparam "c:\last param"'

【讨论】:

  • 忽略所有这些,查看我发现的问题。
【解决方案2】:

我使用 exec 扩展非常成功地做到了这一点

这是语法:

  SetOutPath $INSTDIR\${APPLICATION_DIR}
    ExpandEnvStrings $0 %COMSPEC%
    nsExec::ExecToStack '"C:\path-tobatch-file\commands.bat"'

这里是 NSIS Wiki 的链接 http://nsis.sourceforge.net/Docs/nsExec/nsExec.txt

【讨论】:

  • 只是为了澄清一点。批处理文件需要通过命令处理器运行:cmd /c batch_file.bat 而不仅仅是batch_file.bat。可以从 %COMSPEC% 获取到 cmd 的路径。
  • 效果很好,但是,有没有办法设置它,以便在批处理文件执行时显示控制台?批处理文件对大量文件进行了复制/移动,我不希望用户认为它实际上没有做任何事情。
  • 要显示输出,直接 Exec 会显示 Cmd 窗口: Exec '"$0" /C "C:\Path-to-batch\commands.bat"'
  • @DBQ:嗯,有问题,这应该可以正常工作 Exec '"$0" /C "$INSTDIR\batch.bat" "$INSTDIR" "$DATA_FOLDER"' 只要我这样做SetOutPath 和 ExpandEnvStrings
  • 不确定(以前没有使用过这种方式),但直接到 exec 的路径肯定有效。
猜你喜欢
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多