将文本文件的每一行分配给一个变量,以验证数字在Windows批处理脚本中是按顺序排列的

问题描述

我正在学习Windows batch-file脚本并创建自己的脚本来练习编码,但是在尝试查找文本文件中的数字是否顺序时遇到了麻烦。我有两个文件一个文件(file.txt)包含file_received.txt中的行数。 file_received.txt内容如下:

1021
1022
1023
1024
1025
1027
1028

我正在构建一个脚本来测试文本文件中的所有数字是否都按顺序排列。因此,第一步,我尝试通过if / for循环提取要分配给变量的file_received的每一行但是if命令循环同时将所有行分配给file_received.txt中的变量num。是否可以将文件的第一行分配给变量num并随着if循环的增加而递增?

   setlocal EnableDelayedExpansion
    rem assign the number of lines to a variable
    set /P var=<C:\files.txt
    for /F "tokens=1" %%a in ("%var%") do echo.%%a
    
    rem assign the first variable to var1
    set /P var1=<C:\files_received_sequence.txt
    for /F "tokens=1" %%a in ("%var1%") do echo.%%a
    
    set /a x=1
    :while
    if %x% leq %var% (
        echo %x%
        rem assigning each line to the variable num inside the if loop and will be used in comparison and reser
        for /F "tokens=%x%" %%i in (C:\files_received.txt) do set num=%%i
        echo %num%
        set /a x+=1
        goto :while
    )
    
    echo test :D

输出如下所示,在循环1中,将整个文件内容分配给变量num,从循环2到7,分配最后一个数字。

C:\>setlocal EnableDelayedExpansion 
C:\>set /P var= 0<C:\files.txt 
C:\>for /F "tokens=1" %a in ("7 ") do echo.%a
C:\>echo.7
7
C:\>set /P var1= 0<C:\files_received.txt 
C:\>for /F "tokens=1" %a in ("1021") do echo.%a
C:\>echo.1021
1021
C:\>set /a x=1 
C:\>if 1 LEQ 7 (
echo 1  
for /F "tokens=1" %i in (C:\files_received.txt) do set num=%i  
echo   
set /a x+=1  
goto :while 
) 
1
C:\>set num=1021 
C:\>set num=1022 
C:\>set num=1023 
C:\>set num=1024 
C:\>set num=1025 
C:\>set num=1027 
C:\>set num=1028 
ECHO is on.
C:\>if 2 LEQ 7 (
echo 2  
 for /F "tokens=2" %i in (C:\files_received.txt) do set num=%i  
 echo 1028  
 set /a x+=1  
 goto :while 
) 
2
1028

解决方法

这是我用来测试每​​个数字每次依次递增一个(并且只有一个)的逻辑:

@Echo off & Setlocal EnableDelayedExpansion
Set "ln="
For /F "Delims=" %%i in (C:\file_received.txt) Do (
 If Not "!ln!"=="" For /F "UseBackQ Delims=" %%v in (`"Set /A Nx=!ln!+1"`) Do (If Not "%%i"=="%%v" (Echo/OoS:!ln!/%%i & Goto :False))2> Nul
 Set "ln=%%i"
)
Echo/True
Exit /B 0
:False
Echo/False
Exit /B 1
,

除了您不使用 delayed expansion(尽管您已启用)之外,您的逻辑太复杂了:

attachment

变量@echo off setlocal enabledelayedexpansion set last=-1 for /f %%a in (t.txt) do ( if %%a lss !last! ( echo not in sequence goto :eof ) set "last=%%a" ) echo all in sequence. 保存着循环的前一次迭代的值。

(根据您的需要,您可能希望将!last!替换为lss

,

这里是一个版本,它将不按顺序突出显示该项目。请注意,它将仅测试序列,换句话说,请确保上一个结果低于下一个

@echo off & setlocal enabledelayedexpansion
set rev=-1
for /f "delims=" %%a in (files_received.txt) do for %%i in (%%a) do (
   if %%i leq !rev! (
    echo %%i Out of sequence
  ) else (
    echo %%i
    set rev=%%i
  )
)