Batch file 什么事!被改进的!做
我试图弄清楚以下表达式在我正在处理的bat文件中的含义:Batch file 什么事!被改进的!做,batch-file,cmd,Batch File,Cmd,我试图弄清楚以下表达式在我正在处理的bat文件中的含义: SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%! !modified! >> %outvar% 这是在“\”的定界if语句之后声明执行的,并获取传递给脚本执行的参数,然后将它们作为字符串分开,并将字符串写入文件中。 更具体地说:感叹词(!*!)在这种情况下做什么? 我找了大约一个小时,但没有结果。有人能给点提示吗?感叹号用于,使用方式与%-符号用于变量。这主要用于括号内。这是因
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对不起,我误读了你回答的时间。如果你能编辑你的帖子(一封信或其他什么),我会投上一票。我不担心投上一票,我只是对没有理由的答案(正确答案)投下一票感到恼火。不用担心,桥下有水。