Batch file 如何处理批次中的延迟扩展

Batch file 如何处理批次中的延迟扩展,batch-file,Batch File,我在理解如何调用批处理函数时遇到了一些问题,而没有遇到delayedExpansion问题 我得到的错误是 )在这个时候是出乎意料的 经过几次搜索,我明白这是因为启用了延迟扩展,但我不知道如何处理它 @echo off Setlocal EnableDelayedExpansion set RUN_MODE=%1 set STRING=%2 if %RUN_MODE%==1 ( echo %STRING% if "%STRING%"=="empty" ( :d


我在理解如何调用批处理函数时遇到了一些问题,而没有遇到delayedExpansion问题 我得到的错误是

)在这个时候是出乎意料的

经过几次搜索,我明白这是因为启用了延迟扩展,但我不知道如何处理它

@echo off
Setlocal EnableDelayedExpansion

set RUN_MODE=%1
set STRING=%2

if %RUN_MODE%==1 (
    echo %STRING%
    if "%STRING%"=="empty" (
        :dontDo
    )
    :doSomething
    :dontDo
)
goto:eof

:doSomething
    echo doingSomething
goto:eof

切勿在括在
()
括号内的命令块内使用
:标签
::标签式注释。检查证据

@echo off
Setlocal EnableExtensions
rem in current code snippet: no need for EnableDelayedExpansion 

set "RUN_MODE=%~1"
set "STRING=%~2"

if "%RUN_MODE%"=="1" (
    echo(%STRING%
    if "%STRING%"=="empty" (
        rem dontDo
    ) else
        CALL :doSomething
        rem or `GOTO :doSomething` instead of `CALL` if don't need to return here
    )
    rem conjoint for `dontDo` and `doSomething` continues here
)
goto:eof

:doSomething
    echo doingSomething
goto:eof

  • ,例如,
    set“STRING=%~2”
  • %~1
    %~2
  • 如果“%RUN\u MODE%”为空变量,则在
    中使用双引号(
    ;如果没有双引号,
    如果%RUN\u MODE%==1(
    可能导致语法错误
    如果==1(
    ),即如果“%RUN\u MODE”为空变量,则true条件将导致
    如果“%RUN\u MODE=”
    语句
  • echo(%STRING%
    中的左括号;如果没有它,
    echo%STRING%
    命令显示当前的echo设置
    echo关闭
    消息,如果变量为空
    STRING
    ,即如果“%STRING%”==“true”条件导致
    语句

同时阅读和。

切勿在括号内的命令块内使用
:label
::label-like-comment
。检查证据

@echo off
Setlocal EnableExtensions
rem in current code snippet: no need for EnableDelayedExpansion 

set "RUN_MODE=%~1"
set "STRING=%~2"

if "%RUN_MODE%"=="1" (
    echo(%STRING%
    if "%STRING%"=="empty" (
        rem dontDo
    ) else
        CALL :doSomething
        rem or `GOTO :doSomething` instead of `CALL` if don't need to return here
    )
    rem conjoint for `dontDo` and `doSomething` continues here
)
goto:eof

:doSomething
    echo doingSomething
goto:eof

  • ,例如,
    set“STRING=%~2”
  • %~1
    %~2
  • 如果“%RUN\u MODE%”为空变量,则在
    中使用双引号(
    ;如果没有双引号,
    如果%RUN\u MODE%==1(
    可能导致语法错误
    如果==1(
    ),即如果“%RUN\u MODE”为空变量,则true条件将导致
    如果“%RUN\u MODE=”
    语句
  • echo(%STRING%
    中的左括号;如果没有它,
    echo%STRING%
    命令显示当前的echo设置
    echo关闭
    消息,如果变量为空
    STRING
    ,即如果“%STRING%”==“true”条件导致
    语句

阅读和。

如果“%STRING%”==“empty”(
变为
如果“!STRING!”==“empty”),则使用带有
的延迟扩展来代替
%
符号(
。顺便说一句,在块内使用标签是个坏主意,这只会导致错误,您不需要它。只有在一行上的值发生更改时才需要它。括号中的内容是一行。没有它,变量在读取行时会展开。使用它(!var!)它在使用时进行了扩展,这与传统的批处理文件不兼容。因为您不在一行上更改并尝试使用变量-您不需要它。请继续使用esclamation标记来表示错误。如何避免使用labesl?如果您需要在批处理文件中使用标签,请使用
GOTO
or
调用
命令。如果“%STRING%”==“empty”(
变为
如果“!STRING!”==“empty”),则使用带有
的延迟扩展,而不是
%
符号(
。顺便说一句,在块内使用标签是个坏主意,这只会导致错误,您不需要它。只有在一行上的值发生更改时才需要它。括号中的内容是一行。没有它,变量在读取行时会展开。使用它(!var!)它在使用时进行了扩展,这与传统的批处理文件不兼容。因为您不在一行上更改并尝试使用变量-您不需要它。请继续使用esclamation标记来表示错误。如何避免使用labesl?如果您需要在批处理文件中使用标签,请使用
GOTO
or
调用
命令。