Windows批处理:for循环中的延迟扩展

时间:2012-06-09 11:07:36

标签: windows batch-file

我想修改一些特定行的文本文件,我写了一个批处理文件如下:

@echo off
set n=0
set n1=10
set n2=40
cd.>output.txt

for /f "delims=" %%i in ('findstr /n .* test.txt') do (
set "var=%%i"
setlocal enabledelayedexpansion
set /a n=!n!+1
echo.!n!
set var=!var:*:=!
rem if !n!=%n1% ...
rem if !n!=%n2% ...
(echo.!var!)>>output.txt
endlocal
)
start output.txt

然而,这并不像预期的那样有效 经过一些测试,我认为!n!扩展通常不会延迟。这很奇怪,因为!var!扩展通常会延迟。

顺便说一句,setlocal enabledelayedexpansionendlocal命令放在for循环中,否则特殊字符!将被放弃。

1 个答案:

答案 0 :(得分:3)

我认为你看到的问题是n永远不会增加。

但这不是延迟扩展的问题,它是循环内setlocal/endlocal块的有效之处。
正如panda-34所提到的,你应该使用set/a的扩展语法,并将语句移到setlocal/endlocal块之外。

@echo off
set n=0
set n1=10
set n2=40

(
  for /f "delims=" %%i in ('findstr /n .* test.txt') do (
    set "var=%%i"
    set /a n+=1
    setlocal enabledelayedexpansion
    echo !n!
    set var=!var:*:=!
    rem if !n!=%n1% ...
    rem if !n!=%n2% ...
    (echo(!var!)
    endlocal
  )
) >output.txt
start output.txt