为什么makensis.exe即使工作,仍返回errorlevel 1?

为什么makensis.exe即使工作,仍返回errorlevel 1?,nsis,batch-file,errorlevel,Nsis,Batch File,Errorlevel,我有一个NSIS脚本可以运行。编译后,生成的安装程序工作正常。但是,makensis.exe返回1而不是0。这是一个真正的痛苦,因为我在持续集成设置中使用它,而现在我的CI认为构建失败了 当我将我的项目从SVN切换到Git时,这才刚刚开始,并且在NSIS脚本中做了一个微小的更改(我在两个地方更改了路径) 我找不到打印的编译错误(即使使用/V4) 有6条警告,但它们与makensis返回0的旧回购协议中的6条相同 我将以前的“errorlevel=0”输出与新的“errorlevel=1”输出进

我有一个NSIS脚本可以运行。编译后,生成的安装程序工作正常。但是,makensis.exe返回1而不是0。这是一个真正的痛苦,因为我在持续集成设置中使用它,而现在我的CI认为构建失败了

当我将我的项目从SVN切换到Git时,这才刚刚开始,并且在NSIS脚本中做了一个微小的更改(我在两个地方更改了路径)

  • 我找不到打印的编译错误(即使使用/V4)
  • 有6条警告,但它们与makensis返回0的旧回购协议中的6条相同
  • 我将以前的“errorlevel=0”输出与新的“errorlevel=1”输出进行了比较,没有发现显著差异
  • 它生成了一个运行良好的安装程序
  • 我仍然使用相同的makensis.exe副本
然而,它返回errorlevel1

我确信几年前我就有过这个问题,但我不记得我是如何解决的。我想我刚刚升级到了NSIS的最新版本,但这次不行(我已经在使用最新版本了)。

问题出在执行makensis.exe的批处理文件中。它是这样的:

for %%A in (*.nsi) do (
    makensis.exe "%%A"
    if %errorlevel% neq 0
        echo %%A Failed.
    )
)
问题是%errorlevel%在循环开始时被求值为常量。为了实际检查循环中的错误级别,必须使用
!错误等级不是
%errorlevel%
。您还必须在批处理文件的顶部设置
setlocalenabledayedexpansion
(我已经有了)


所以很明显,之前的一些不重要的步骤(可能是mkdiring一个已经存在的dir)返回了errorlevel1,然后我的检查认为它来自makensis调用。当然,这引出了一个永恒的问题:“这是如何工作的?”

您可能会将该代码更改为:makensis.exe“%%A”&&(如果选中,则跳过errorlevel)