求解下面批处理代码的详细注释: 谢谢!
来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/11/11 07:21:01
求解下面批处理代码的详细注释: 谢谢!
@echo off
set a=1
set dst=1
setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (
set num=%%i
if "!a!"=="1" (echo !num!>b.txt&set a=)
if not !num!==!dst! (call :dd)
for /f "delims=" %%j in (c.txt) do (
set dst=!num!
set var=%%j
if "!num!"=="!var!" set lis=y
)
)
start b.txt
:dd
if "%dst%"=="1" goto :eof
if not "%lis%"=="y" (echo %dst%>>b.txt) else (set lis=)
goto :eof
这段代码的名字是删除txt文件中重复的行.bat 你说能行不?能删除下面重复的行吗?
比如: 12345
12346
12347
1234567
12346
12345
12345678
123456789
1234567890
@echo off
set a=1
set dst=1
setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (
set num=%%i
if "!a!"=="1" (echo !num!>b.txt&set a=)
if not !num!==!dst! (call :dd)
for /f "delims=" %%j in (c.txt) do (
set dst=!num!
set var=%%j
if "!num!"=="!var!" set lis=y
)
)
start b.txt
:dd
if "%dst%"=="1" goto :eof
if not "%lis%"=="y" (echo %dst%>>b.txt) else (set lis=)
goto :eof
这段代码的名字是删除txt文件中重复的行.bat 你说能行不?能删除下面重复的行吗?
比如: 12345
12346
12347
1234567
12346
12345
12345678
123456789
1234567890
楼上热心网友解释的很详细.
这个批处理的原理就是将a.txt逐行读出,从第一行开始判断是否与b.txt的某行相同,如果没有相同的行就写到b.txt,如果有相同的行就继续读a.txt的下一行.用!a!来指示首行直接写入b.txt覆盖原内容.
这个批处理的代码不合理,有些是没用的.比如用!a!标记是否为第一行(可以用cd.>b.txt清空原内容,这样第一行就不用特殊处理);用!lis!标记是否存在相同行(这个可以不标记,退出循环即可).set dst=!num!这句放在第二个循环里无意义.批处理中还有个问题:如果是删除一个txt里的重复行,那么代码中“c.txt”应该是"b.txt"
删重复行不用这么麻烦的.下面是我给简化的,原理没变,只是去掉了无用的部分.
@echo off
cd.>b.txt
for /f "delims=" %%z in (a.txt) do call :check %%z
start b.txt
pause
goto:eof
:check
for /f "delims=" %%y in (b.txt) do if %%y==%1 exit /b
echo,%1>>b.txt
exit /b
对应行解释:
关闭回显
生成空文件 b.txt
循环取a.txt中的每行,并以其为参数调用 :check
打开文本b.txt
暂停
跳到结尾(运行结束)
标签:check (此处可以理解成子程序)
循环读b.txt中各行,并判读是否与:check的第一个参数相同,如果相同就结束call返回到调用处,(如果b.txt中所有行都不与该参数的内容相同就继续下行.)
将:check的第一个参数写到b.txt
结束call 返回到调用处.
这个批处理的原理就是将a.txt逐行读出,从第一行开始判断是否与b.txt的某行相同,如果没有相同的行就写到b.txt,如果有相同的行就继续读a.txt的下一行.用!a!来指示首行直接写入b.txt覆盖原内容.
这个批处理的代码不合理,有些是没用的.比如用!a!标记是否为第一行(可以用cd.>b.txt清空原内容,这样第一行就不用特殊处理);用!lis!标记是否存在相同行(这个可以不标记,退出循环即可).set dst=!num!这句放在第二个循环里无意义.批处理中还有个问题:如果是删除一个txt里的重复行,那么代码中“c.txt”应该是"b.txt"
删重复行不用这么麻烦的.下面是我给简化的,原理没变,只是去掉了无用的部分.
@echo off
cd.>b.txt
for /f "delims=" %%z in (a.txt) do call :check %%z
start b.txt
pause
goto:eof
:check
for /f "delims=" %%y in (b.txt) do if %%y==%1 exit /b
echo,%1>>b.txt
exit /b
对应行解释:
关闭回显
生成空文件 b.txt
循环取a.txt中的每行,并以其为参数调用 :check
打开文本b.txt
暂停
跳到结尾(运行结束)
标签:check (此处可以理解成子程序)
循环读b.txt中各行,并判读是否与:check的第一个参数相同,如果相同就结束call返回到调用处,(如果b.txt中所有行都不与该参数的内容相同就继续下行.)
将:check的第一个参数写到b.txt
结束call 返回到调用处.