18

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

4

3 回答 3

13

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

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

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

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

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

编辑:

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

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

NSIS 脚本参考是你的朋友 :)(ctrl+f 也是如此)

于 2012-07-18T14:15:04.483 回答
10

尝试使用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'
于 2012-07-16T21:47:27.170 回答
2

我们可以从 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 获取退出代码。

于 2018-07-13T12:50:17.823 回答