Batch file 什么事!被改进的!做

Batch file 什么事!被改进的!做,batch-file,cmd,Batch File,Cmd,我试图弄清楚以下表达式在我正在处理的bat文件中的含义: SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%! !modified! >> %outvar% 这是在“\”的定界if语句之后声明执行的,并获取传递给脚本执行的参数,然后将它们作为字符串分开,并将字符串写入文件中。 更具体地说:感叹词(!*!)在这种情况下做什么? 我找了大约一个小时,但没有结果。有人能给点提示吗?感叹号用于,使用方式与%-符号用于变量。这主要用于括号内。这是因

我试图弄清楚以下表达式在我正在处理的bat文件中的含义:

SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%!
!modified! >> %outvar%
这是在“\”的定界if语句之后声明执行的,并获取传递给脚本执行的参数,然后将它们作为字符串分开,并将字符串写入文件中。 更具体地说:感叹词(!*!)在这种情况下做什么?
我找了大约一个小时,但没有结果。有人能给点提示吗?

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

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

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

它将正确地回显1。还要注意
只需要在括号内,不需要在括号外。

标记是变量的延迟扩展表示法(有关此标记的文档,请参阅
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
这是因为延迟扩展符号
,告诉处理器评估
!新价值执行相应行时


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

这两个答案都完美地解释了发生的事情。我感谢你们的帮助@NiU-不确定bash,但如果您愿意,您可以在批处理子例程中的
if
语句中实际分解代码,并减少延迟扩展的需要-在大多数情况下。然而,很多时候,这是不值得的,在您的情况下,变量被用作替换行中的参数,只使用延迟扩展表示法要简单得多。考虑到我们的答案是在同一时间发布的,我觉得这个指控很有趣(看看您的编辑历史时间戳)。无论如何,OP得到了帮助,这才是最重要的;在这个网站上进行的“游戏”有时令人沮丧…@JasonFaulkner对不起,我误读了你回答的时间。如果你能编辑你的帖子(一封信或其他什么),我会投上一票。我不担心投上一票,我只是对没有理由的答案(正确答案)投下一票感到恼火。不用担心,桥下有水。