我刚刚发现,SET
在.bat
和.cmd
中的行为是不同的。我的实验表明,SET
的行为由启动批处理文件的扩展名(.bat或.cmd)决定,而不是由SET
语句所在的文件扩展名决定。
这是Windows NT CMD批处理脚本引擎的一个模糊角落,Ben Hoffstein稍微提到了一下。我想知道,我的结论是否正确?或者,在Microsoft文档中正式讨论了这个问题吗?
我还想知道,有没有办法检查或甚至更改当前的模式?是.bat模式还是.cmd模式?如果没有,我必须接受这样一个事实,即我们的批处理脚本作者(尤其是在编写批处理函数时)不能做出任何假设。
我的实验如下
从Windows 7 SP1运行。
showerr.bat
@echo off
setlocal EnableDelayedExpansion
call :SetErrorlevel 40
set var=1
echo Err=%ERRORLEVEL%
exit /b 0
REM ==== Functions below ====
:SetErrorlevel
exit /b %1
showerr.cmd
与showerr.bat相同。
start-subcmd.bat
启动子命令的批处理文件。
call showerr.cmd
start-subbat.cmd
call showerr.bat
以下是结果:
结果如下: