问题描述
我正在学习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
)
)