if "%OS%"=="Windows_NT" @setlocal
...
if "%OS%"=="Windows_NT" @endlocal
以上基本上是这个意思:
if(OS == 'Windows_NT'):
...
endif
setlocal
的内容是什么?
bat如何识别endif
?
答案 0 :(得分:3)
试
setlocal /?
在命令提示符
对于if
语句:help if
应该向您显示您需要知道的所有内容。批处理文件只包含表单
if
语句
if
[条件] [语句]
if
[条件] [语句]else
[语句
但是,[语句]可以是一个块,由括号分隔:
if
[条件](
[语句]
[语句]
...
)
if
[条件](
[语句]
...
)
else
(
[语句]
...
)
没有明确的end if
关键字。 if
语句的结尾由行的结尾或带括号的块的末尾标记。
另请注意,您需要注意设置并随后在单个块中使用环境变量。在help set
中阅读延迟扩展以了解那里的陷阱。
答案 1 :(得分:2)
答案 2 :(得分:0)
基于实际示例的解释:Apache Tomcat
我选择了这个例子,因为它包含了你想知道的一切。我还添加了一些简单的例子。
"%OS%" == "Windows_NT"
它在Tomcat(catalina.bat)的旧版本中用作:
if "%OS%" == "Windows_NT" setlocal
但是从 Tomcat 8 开始(此时只有Tomcat 8和Tomcat 9 - 里程碑版本可用)它被替换为:
setlocal
因为%OS%
在新的Windows操作系统上总是Windows_NT
。
因此,在现代Microsoft Windows versions上,if
毫无用处。只需使用setlocal
。
<强>参考强>:
https://en.wikipedia.org/wiki/Environment_variable#OS(Windows):
%OS%变量包含操作系统系列的符号名称,以区分批处理按钮中的不同功能集。在 Windows NT , Windows 2000 , Windows XP 和 Windows 7 下,它始终保存字符串“ Windows_NT“即可。它类似于在数字研究的所有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):
此变量包含操作系统的名称,以便在批处理作业和应用程序中区分数字研究的不同DOS相关操作系统。[5]已知值包括“DOSPLUS”(DOS仿真中的DOS Plus 1.2),“CPCDOS 4.1”(CP + M仿真中的DOS Plus 1.2),“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”(并行DOS),“CPCDOS”(并行PC DOS),“CDOS386”(并行DOS 386),“DRMDOS”(DR多用户DOS) ,“MDOS”(CCI Multiuser DOS),“REAL32”(REAL / 32)。[2] [6] MS-DOS INTERSVR也会查找“DRDOS”的值。[6]另请参阅稍后在Microsoft Windows NT系列中引入的同名环境变量%OS%。
if
在旧的 Tomcat 版本(8之前)中,如果"%OS%" == "Windows_NT"
中的条件if "%OS%" == "Windows_NT" setlocal
为false,则只会跳过setlocal
。其他命令可以正常运行。
在您的情况中,如果条件为真(并且可能是 - 请参阅上面的说明),则只会运行一个命令(该虚拟{{ 1}}恰好位于行的末尾 - 就在endif
之后。
以下简单示例应该清楚:
@setlocal
从控制台运行testif.bat打印:
@echo off
rem testif.bat
if "1" == "2" echo a
echo b
if "1" == "1" echo c
echo d
即使第一个条件为false,只有b
c
d
受此值影响,因为它已被跳过。因此,虚拟echo a
位于endif
之后(echo a
之前)。
echo b
在 Tomcat (\ bin \ startup.bat)中,您可以像这样设置setlocal
和CATALINA_HOME
个变量:
CATALINA_BASE
在<{strong> set CATALINA_HOME=%~dp0
set CATALINA_BASE=%CATALINA_HOME%
行之后 。如果在setlocal
之前添加这些行,那么这两个变量将在批处理脚本结束后可用。如果您使用双击(正常方式)运行脚本,它们没有“副作用”,但是如果您想从命令提示符运行它,则很重要。
简化版:
setlocal
从命令提示符运行上面的脚本(@echo off
rem 1.bat
set A=1
setlocal
set B=2
endlocal
set C=3
),然后运行以下命令:
1.bat
因此,由于您不希望拥有rem - prints 1
echo %A%
rem - prints %B%
echo %B%
rem - prints 3
echo %C%
和A
的值,因此您应该在C
和setlocal
之间设置环境变量。当然,如果您从新提示中运行相同的endlocal
命令,则不会设置任何命令(输出将为echo
,%A%
,%B%
)。< / p>
如果没有明确的%C%
,请想象它位于批处理文件的末尾:
参考:
运行批处理文件时,使用 setlocal 更改环境变量。运行setlocal后进行的环境更改是批处理文件的本地更改。当Cmd.exe遇到 endlocal 命令或到达批处理文件的末尾时,它会恢复以前的设置。