2012-06-09 55 views
2

我想修改的文本文件数的几个特定的​​行,我写了一个批处理文件,如下所示:Windows批处理:延迟扩展在for循环中

@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循环,因为否则的特殊字符!将被放弃。

+2

如果你解释你正在做什么以及什么不工作,你获得帮助的机会将大大提高。对于不工作的部分,您应该解释预期结果并描述您所看到的内容。 – dbenham

+0

我没有尝试分析你的代码,但是不应该使用'set/a n + = 1'而不是'set/an =!n!+ 1' –

+0

@ panda-34 - 我更喜欢你的建议语法,但都应该工作。 – dbenham

回答

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 
+0

是的,问题与您所说的一样,但是您的代码不起作用。 – user1446072

+0

@ user1446072:请问这个代码不工作的方式是什么? –

+2

@ user1446072 - 正如我在之前的问题中所暗示的那样:如果我们不知道应该做什么,那么任何人都很难“修复”你的代码。对于jeb来说,找到一个重要的问题(+1)是一个很好的发现,但是代码的预期行为仍然是一个谜。 – dbenham