我正在创建我的第一个 NSI 脚本,我只是想知道是否可以从 NSIS 执行命令行命令,还是应该只执行批处理文件?我真的不知道从哪里开始,其他类似的话题也让我有点不知所措。
3 回答
我建议看一下 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 也是如此)
尝试使用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'
我们可以从 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 获取退出代码。