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

Windows批处理:for循环中的延迟扩展,windows,batch-file,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%

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

@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扩展通常不会延迟。这很奇怪,因为
!瓦尔扩展通常延迟


顺便说一句,
setlocalenabledelayedexpansion
endlocal
命令被放入
for
循环中,否则特殊字符
将被放弃。

我想你看到的问题是,
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 

如果你能解释一下你想做什么以及到底什么不起作用,你获得帮助的机会就会大大提高。对于不起作用的部分,您应该解释预期结果并描述您看到的内容。我没有尝试分析您的代码,但您不应该使用
set/a n+=1
而不是
set/a n=!n+1
@panda-34-我更喜欢你建议的语法,但两者都应该起作用。但是延迟变量只能在
setlocal/endlocal
块中起作用,并且在那里变量
n
不能真正增加,问题正如你所说的,但是你的代码不起作用。@user1446072-正如我在前面的问题评论中所暗示的:如果我们不知道你的代码应该做什么,那么任何人都很难“修复”你的代码。jeb发现了一个重要的问题(+1),这是一个很好的发现,但是代码的预期行为仍然是一个谜。经过一些修改,问题已经解决了。关键是将语句
set/a
移到
setlocal/endlocal
块之外。谢谢大家!@德本纳姆:很抱歉,我没有把问题说清楚。我是windows批处理和这个论坛的新手,而且,我的英语不是很好。。。无论如何,谢谢大家!