【问题标题】:Windows batch: delayed expansion in a for loopWindows批处理:for循环中的延迟扩展
【发布时间】:2012-06-09 11:07:36
【问题描述】:

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

@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 循环中,否则特殊字符! 将被丢弃。

【问题讨论】:

  • 如果您解释您正在尝试做什么以及究竟是什么不起作用,您获得帮助的机会将大大提高。对于不起作用的部分,您应该解释预期结果并描述您所看到的。
  • 我没有尝试分析您的代码,但您不应该使用set /a n+=1 而不是set /a n=!n!+1
  • @panda-34 - 我更喜欢你建议的语法,但两者都应该工作。
  • 但是延迟变体只能在 setlocal/endlocal 块内工作,并且变量 n 不能真正增加

标签: windows batch-file


【解决方案1】:

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

【讨论】:

  • 是的,问题正如你所说,但你的代码不起作用。
  • @user1446072 - 正如我在之前的问题评论中所暗示的那样:如果我们不知道它应该做什么,那么任何人都很难“修复”您的代码。发现一个重大问题 (+1) 对 jeb 来说是一个很好的收获,但您的代码的预期行为仍然是个谜。
  • 经过一些修改,问题已经解决。关键是将语句set /a 移到setlocal/endlocal 块之外。谢谢!
  • @dbenham:很抱歉我没有清楚地说明问题。我是windows batch和这个论坛的新手,而且,我的英语不是很好......无论如何,谢谢大家!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 2017-10-05
  • 1970-01-01
  • 2012-05-20
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多