我试图找出以下表达式在我正在使用的bat文件中的含义:
SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%!
!modified! >> %outvar%
在为<_>分隔 if 语句后立即声明执行,并获取传递给脚本执行的参数,然后将它们分隔为字符串并将字符串写入文件中。 更具体地说:在这种情况下,感叹(!*!)做了什么? 我搜索了一个小时,但没有结果。任何人都可以提示吗?
答案 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
语句。