if "%OS%"=="Windows_NT" @setlocal
...
if "%OS%"=="Windows_NT" @endlocal
上面的内容基本上是这个意思吗?
if(OS == 'Windows_NT'):
...
endif
你好!
“setlocal”是什么意思?
批处理文件如何识别“endif”?
if "%OS%"=="Windows_NT" @setlocal
...
if "%OS%"=="Windows_NT" @endlocal
if(OS == 'Windows_NT'):
...
endif
你好!
“setlocal”是什么意思?
批处理文件如何识别“endif”?
尝试
setlocal /?
在命令提示符下:
关于if
语句:输入help if
可以显示你需要知道的所有内容。批处理文件只有单行的if
语句形式:
if
[条件] [语句]
if
[条件] [语句]else
[语句]
然而,方括号内的[语句]可以是由括号括起来的块:
if
[条件](
[语句]
[语句]
...
)
if
[条件](
[语句]
...
)
else
(
[语句]
...
)
没有明确的end if
关键字。if
语句的结尾由行末或括号块的结尾标记。
还要注意,在单个块中设置并随后使用环境变量时需要小心。在help set
中了解延迟扩展的陷阱。
基于实际例子的解释:Apache Tomcat
我选择这个例子是因为它包含了你想知道的所有内容。我还添加了一些简单的示例。
"%OS%" == "Windows_NT"
这个语句在旧版本的Tomcat(catalina.bat)中使用:
if "%OS%" == "Windows_NT" setlocal
但是从Tomcat 8开始(目前只有Tomcat 8和Tomcat 9 - 里程碑版本可用),它被替换为:
setlocal
因为新的Windows操作系统上%OS%
始终为Windows_NT
。所以,在现代Microsoft Windows版本上,那个if
是无用的。只需使用setlocal
。
参考资料:
https://en.wikipedia.org/wiki/Environment_variable#OS(Windows):
%OS%变量包含一个操作系统系列的符号名称,以区分批处理作业中不同的特性集。在Windows NT、Windows 2000、Windows XP和Windows 7下,它总是保持字符串“Windows_NT”。它类似于所有Digital Research-origin DOS相关操作系统中都有的名为%OS%的环境变量,如Concurrent DOS、Multiuser DOS、REAL/32、DOS Plus、DR DOS、Novell DOS和OpenDOS。
我没有找到任何关于Windows 8和Windows 10的参考资料,但我在两者上测试过它们具有相同的行为(它包含“Windows_NT”)。
https://en.wikipedia.org/wiki/Environment_variable#.25OS.25(DOS):
此变量包含操作系统名称,以区分批处理作业和应用程序中Digital Research-origin的不同DOS相关操作系统。[5]已知的值包括“DOSPLUS”(DOS Plus 1.2在DOS仿真中),“CPCDOS 4.1”(DOS Plus 1.2在CP/M仿真中),“DRDOS”(DR DOS 3.31-6.0,DR DOS Panther,DR DOS StarTrek,DR-DOS 7.02 [5]-7.05),“EZDOS”(EZ-DOS 3.41),“PALMDOS”和“NetWare PalmDOS”(PalmDOS 1.0),“NWDOS”(Novell DOS 7),“NWDOS7”(Novell DOS 7 Beta),“OPENDOS”(Caldera OpenDOS 7.01,Caldera DR-OpenDOS 7.02),“CDOS”(Concurrent DOS),“CPCDOS”(Concurrent PC DOS),“CDOS386”(Concurrent DOS 386),“DRMDOS”(DR Multiuser DOS),“MDOS”(CCI Multiuser DOS),“REAL32”(REAL/32)。[2] [6] MS-DOS INTERSVR也寻找值为“DRDOS”。[6]请参阅后来在Microsoft Windows NT系列中引入的同名环境变量%OS%。
if
在旧版本的Tomcat(8之前),如果if "%OS%" == "Windows_NT" setlocal
中的条件"%OS%" == "Windows_NT"
为false,则只有setlocal
会被跳过。其他命令将正常运行。
在您的情况下,如果条件为真(很可能是这样-请参见上面的解释),则只会运行一个
if
的结束呢? - user198729else
好像不被支持:if 1 == 1 ( echo 1 echo good ) else ( echo 2 echo bad )。但是,当代码块只有一行时,它可以正常工作。 - user198729