.bat的语法是什么?

时间:2010-02-24 11:54:23

标签: windows if-statement batch-file

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

以上基本上是这个意思:

if(OS == 'Windows_NT'):
...
endif

setlocal的内容是什么?

bat如何识别endif

3 个答案:

答案 0 :(得分:3)

setlocal /? 

在命令提示符

对于if语句:help if应该向您显示您需要知道的所有内容。批处理文件只包含表单

的单行if语句
  

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

但是,[语句]可以是一个块,由括号分隔:

  

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

     

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

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

另请注意,您需要注意设置并随后在单个块中使用环境变量。在help set中阅读延迟扩展以了解那里的陷阱。

答案 1 :(得分:2)

答案 2 :(得分:0)

基于实际示例的解释:Apache Tomcat

我选择了这个例子,因为它包含了你想知道的一切。我还添加了一些简单的例子。

  1. "%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%。

  2. 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之前)。

  3. echo b

    Tomcat (\ bin \ startup.bat)中,您可以像这样设置setlocalCATALINA_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的值,因此您应该在Csetlocal之间设置环境变量。当然,如果您从新提示中运行相同的endlocal命令,则不会设置任何命令(输出将为echo%A%%B%)。< / p>

    如果没有明确的%C%,请想象它位于批处理文件的末尾:

    参考:

    • https://technet.microsoft.com/en-us/library/bb491001.aspx
        

      运行批处理文件时,使用 setlocal 更改环境变量。运行setlocal后进行的环境更改是批处理文件的本地更改。当Cmd.exe遇到 endlocal 命令或到达批处理文件的末尾时,它会恢复以前的设置。