什么!修改!做

时间:2016-02-19 13:49:32

标签: batch-file cmd

我试图找出以下表达式在我正在使用的bat文件中的含义:

SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%!
!modified! >> %outvar%

在为<_>分隔 if 语句后立即声明执行,并获取传递给脚本执行的参数,然后将它们分隔为字符串并将字符串写入文件中。 更具体地说:在这种情况下,感叹(!*!)做了什么? 我搜索了一个小时,但没有结果。任何人都可以提示吗?

2 个答案:

答案 0 :(得分:2)

感叹号用于delayed variable expansions,其使用方式与%相同 - 符号用于变量。这主要用在括号内。这是因为批处理执行循环和if语句的方式。考虑这段代码:

@echo off
set "i=0"
if %i% equ 0 (
set "i=1"
echo %i%
)
pause

执行时,这不会像预期的那样回显1,而是回显0.这是因为在执行if中的语句之前%i%0替换为!i!。但是,如果您使用setlocal EnableDelayedExpansion@echo off setlocal EnableDelayedExpansion set "i=0" if %i% equ 0 ( set "i=1" echo !i! ) echo %i% pause ,请执行以下操作:

!

它将正确回显1.还要注意my_list = ["NYC Football", ["NY Giants","NY Jets"], "NYC Hockey", ["NY Rangers", "NY Islanders", "NJ Devils"]] for item in my_list: if type(item) == list: for i in item: print(i) 仅在括号内需要,而不是在它们之外。

答案 1 :(得分:2)

!标记是变量的延迟扩展符号(有关此文档,请参阅SETLOCAL /?)。本质上,!标记告诉处理器在执行行时评估变量,而不是在解析时,这是%的行为。

举个简单的例子:

SET MyValue=This
IF "%MyValue%"=="This" (
     SET NewValue=That
     SET MyValue=%NewValue%
)
ECHO NewValue = %NewValue%
ECHO MyValue = %MyValue%

REM Outputs:
REM NewValue = That
REM MyValue = 

MyValue没有值,因为在解析IF语句时,%NewValue%还没有分配值(因为SET行尚未处理)

现在考虑一下:

SETLOCAL EnableDelayedExpansion

SET MyValue=This
IF "%MyValue%"=="This" (
     SET NewValue=That
     SET MyValue=!NewValue!
)
ECHO NewValue = %NewValue%
ECHO MyValue = %MyValue%

REM Outputs:
REM NewValue = That
REM MyValue = That

ENDLOCAL

这是有效的,因为延迟扩展符号!告诉处理器在执行相应行时评估!NewValue!

此外,在您的情况下,执行替换的SET行允许将变量用作替换参数。延迟扩展符号更容易使用,而不必将其分解为CALL语句。

相关问题