Windows 批处理 : delayed expansion in a for loop

标签 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! 扩展通常会延迟。

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

最佳答案

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

但这不是延迟扩展的问题,而是循环内 setlocal/endlocal block 的影响。
正如 @panda-34 提到的,您应该使用 set/a 的扩展语法并将语句移到 setlocal/endlocal block 之外。

@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 

关于Windows 批处理 : delayed expansion in a for loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10960467/

相关文章:

windows - 使用 GPO 创建 SymLink

c++ - Windows GUI + 控制台输出,Linux 风格

windows - Inno 安装程序 : restart during setup process won't start after reboot

c++ - 如何将批处理文件的输出读入 C++ 中的字符串

batch-file - 将 CHOICE 与 CMD 脚本结合使用

windows - 在批处理脚本中隐藏命令结果

windows - 获取包含 32 位程序的 "Program files"文件夹的路径

wpf - 更换桌面墙纸/在桌面上绘制

batch-file - 从多个 TXT 文件中删除标题行的命令行脚本

batch-file - 如何比较批处理脚本中文件的时间戳?