【问题标题】:Execute Command-Line Command from NSIS从 NSIS 执行命令行命令
【发布时间】:2012-07-15 16:17:09
【问题描述】:

我正在创建我的第一个 NSI 脚本,我只是想知道我是否可以从 NSIS 执行命令行命令,还是应该只执行一个批处理文件?我真的不知道从哪里开始,而且其他类似的话题已经让我有点不知所措了。

【问题讨论】:

  • answer here 可能会有所帮助。它适用于命令行应用程序就好了。

标签: nsis


【解决方案1】:

我建议你看看 nsExec 插件。我最近遇到了一种情况,我需要从 NSIS 脚本中 ping 一个服务器,而下面的代码对我来说非常有效。

nsExec::Exec '"C:\Windows\System32\PING.EXE" $URL'

使用 nsExec 的好处是它执行命令时不会在屏幕上弹出 dos 框。返回值被压入堆栈,您还可以通过几种不同的方式访问程序的输出(如果存在)。

我无法在 NSIS 网站上找到关于该插件的大量信息,但以下链接应该可以让您朝着正确的方向开始:

http://nsis.sourceforge.net/Docs/nsExec/nsExec.txt

编辑:

我注意到您专门询问了作为内部 DOS 命令的 COPY 命令,这意味着您将无法像我使用 ping 那样执行它。我可能弄错了,但您不需要使用任何外部程序来执行这样的基本命令。您应该能够使用 NSIS 命令复制大部分内部命令。

例如复制一个文件(或多个文件),使用 NSIS 命令:CopyFiles

NSIS Scripting Reference 是你的朋友 :)(ctrl+f 也是)

【讨论】:

  • 在不显示命令提示符的情况下执行应用程序的正确选项
  • CopyFiles 会很棒,但它似乎有 ~264 个字符的限制。
【解决方案2】:

尝试使用exec 命令http://nsis.sourceforge.net/Docs/Chapter4.html

4.9.1.2 执行

命令

执行指定的程序并立即继续。请注意,指定的文件必须存在于目标系统上,而不是编译系统上。 $OUTDIR 用于工作目录。如果无法启动进程,则会设置错误标志。请注意,如果命令可以包含空格,则应将其放在引号中以将其与参数分隔。例如:Exec '"$INSTDIR\command.exe" parameters'。如果你不把它放在引号中,它在有或没有参数的 Windows 9x 上都不起作用。

Exec '"$INSTDIR\someprogram.exe"'
Exec '"$INSTDIR\someprogram.exe" some parameters'

【讨论】:

  • 好的,我希望能够从 .nsi 控制命令行并执行以下操作:“copy /b someprogram.exe +,” 听起来我需要这样做它来自一个批处理文件。
  • 你试过这个Exec 'cmd /k copy /b ...' 吗?
【解决方案3】:

我们可以从 NSIS 启动命令行命令,获取返回值,并在此基础上进一步开发安装逻辑。

示例:假设我们需要获取已安装的 clang 编译器版本。要获得我们必须启动的版本:

clang --version 

在 NSIS 中,我们使用 ExecToStack

     nsExec::ExecToStack  'cmd /c "clang --version"'
     Pop $0
     Pop $0
     ;now we have the version in $0

警告:只有第二个 Pop $0 得到我们想要的响应,在本例中是 clang 版本。第一个 Pop $0 获取退出代码。

【讨论】: