.bat文件的语法是什么?

3
if "%OS%"=="Windows_NT" @setlocal
...
if "%OS%"=="Windows_NT" @endlocal

上面的内容基本上是这个意思吗?
if(OS == 'Windows_NT'):
...
endif

你好!

“setlocal”是什么意思?

批处理文件如何识别“endif”?

3个回答

3

尝试

setlocal /? 

在命令提示符下:

关于if语句:输入help if可以显示你需要知道的所有内容。批处理文件只有单行的if语句形式:

if    [条件]    [语句]
if    [条件]    [语句]    else    [语句]

然而,方括号内的[语句]可以是由括号括起来的块:

if    [条件]    (
    [语句]
    [语句]
    ...
)

if    [条件]    (
    [语句]
    ...
)    else    (
    [语句]
    ...
)

没有明确的end if关键字。if语句的结尾由行末或括号块的结尾标记。

还要注意,在单个块中设置并随后使用环境变量时需要小心。在help set中了解延迟扩展的陷阱。


那么蝙蝠是如何识别if的结束呢? - user198729
据我所记,.bat文件只支持单行if语句。因此,行末即为if语句的结束(可能甚至只有一条语句)。 - Joachim Sauer
我在“end if”问题上进行了扩展,尽管这可能是微不足道的 :-) - Joey
感谢您完成我的回答,我已将其设为维基,感谢Johannes Rössel。 - YOU
我刚试了一下,当代码块占据多行时,else好像不被支持:if 1 == 1 ( echo 1 echo good ) else ( echo 2 echo bad )。但是,当代码块只有一行时,它可以正常工作。 - user198729


0

基于实际例子的解释: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 NTWindows 2000Windows XPWindows 7下,它总是保持字符串“Windows_NT”。它类似于所有Digital Research-origin DOS相关操作系统中都有的名为%OS%的环境变量,如Concurrent DOS、Multiuser DOS、REAL/32、DOS Plus、DR DOS、Novell DOS和OpenDOS。

    • 我没有找到任何关于Windows 8Windows 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会被跳过。其他命令将正常运行。

    您的情况下,如果条件为真(很可能是这样-请参见上面的解释),则只会运行一个


  • 网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接