编辑:看来我GOTO :EOF
在语句末尾有一个错误ECHO
,它实际上会转到 :EOF... 哦!谢谢回复。我认为这个错误现在被解决了。
我有一个脚本,我想滚动浏览文本文档并比较文件是否匹配。
脚本在这里:
setlocal enabledelayedexpansion
for /f "tokens=1* delims=\" %%a in (NoMatchA.txt) DO (
set "flag="
for /f "tokens=1* delims=\" %%i in (NoMatchB.txt) do (
IF "%%b"=="%%j" SET flag=1
)
IF DEFINED flag ECHO FLAG DEFINED
IF NOT DEFINED flag ECHO FLAG NOT DEFINED
)
endlocal
编造的输入来自NoMatchA.txt
并NoMatchB.txt
编造的示例:
1234567890 \TEMP\ANIMALS\DOGS\FILE1.pdf
0987654321 \TEMP\TREES\I hate willows.docx
1122334455 \TEMP\LINUX ISOS\linustarvolds.iso
1029384756 \COVID\CANSUCk\MYBALLS\prettyflowers.jpg
1231509876 \USERS\HOMERSIMPSON\Doh.wav
1234567890 \TEMP\ANIMALS\DOGS\FILE1.pdf
0987654321 \TEMP\TREES\I hate willows.docx
1029383321 \COVID\CANSUCk\MYBALLS\prettyflowers.jpg
你明白了。如果我 ECHO,IF "%%b"=="%%j" SET flag=1
我可以清楚地看到它们是相等的,但flag
仍然显示为未定义。
所以基本上,如果文件名匹配,我想以某种方式处理该数据。
答案1
•|编辑:这将防止剩余的线路在设置后经过第二个for
循环flag
,并且线路标识已经发生。
由于标志已经设置,循环不需要继续。
如果行数很少,则不会发生任何变化,但如果行数很多,这可能会对总时间过程产生很大影响。
当添加时goto :skip
,您会立即退出第二个for
循环,避免对每一行重复处理,因为您已经找到相同的字符串/行匹配。
@echo off && setlocal enabledelayedexpansion
cd /d "%~dp0" && if NOT exist NoMatchB.txt call :^)
for /f "tokens=1*" %%a in (NoMatchA.txt) DO (
SET "FLAG="
for /f "tokens=1*" %%i in (NoMatchB.txt)do if NOT defined flag (
IF /i "%%~b"=="%%~j" (
SET "flag=1"
goto :skip
)
)
:skip
ECHO\value FLAG==!flag!
IF DEFINED flag (ECHO\echoed FLAG==1) ELSE ECHO\echoed FLAG==Undefined?
ECHO\
)
endlocal && goto :EOF
这是我更喜欢用不同方法来处理的问题。
通过删除一个变量来启动第一个循环,从那里,只有当某个值等于"%%~b"
和时它才会存在"%%~j"
。
在该点之后,无需在第二个循环中 "%%~b"
比较任何值。"%%~j"
使用if /i
and ~
(“ %%~b
”)去除字符串中的双引号,并在循环中比较两个变量是否带有“双引号”
@echo off && setlocal enabledelayedexpansion
cd /d "%~dp0" && if NOT exist NoMatchB.txt call :^)
for /f "tokens=1*" %%a in (NoMatchA.txt) DO (
SET "FLAG="
for /f "tokens=1*" %%i in (NoMatchB.txt)do if NOT defined flag (
IF /i "%%~b"=="%%~j" SET "flag=1"
)
ECHO\value FLAG==!flag!
IF DEFINED flag (ECHO\echoed FLAG==1) ELSE ECHO\echoed FLAG==Undefined?
ECHO\
)
endlocal && goto :EOF
:^)
>NoMatchA.txt (
echo;1231509876 \USERS\HOMERSIMPSON\Doh.wav
echo;1234567890 \TEMP\ANIMALS\DOGS\FILE1.pdf
echo;0987654321 \TEMP\TREES\I hate willows.docx
echo;1029383321 \COVID\CANSUCk\MYBALLS\prettyflowers.jpg
echo;9999999999 \COVID\CANSUCk\MYBALLS\FlowersOnly.jpg
) && (
>NoMatchB.txt (
echo;1234567890 \TEMP\ANIMALS\DOGS\FILE1.pdf
echo;0987654321 \TEMP\TREES\I hate willows.docx
echo;1122334455 \TEMP\LINUX ISOS\linustarvolds.iso
echo;1029384756 \COVID\CANSUCk\MYBALLS\prettyflowers.jpg
echo;9999999999 \COVID\CANSUCk\MYBALLS\OnlyFlowers.jpg
) ) && exit /b
我不确定我是否错了,但这对我有用,请查看结果:
value FLAG==
echoed FLAG==Undefined?
value FLAG==1
echoed FLAG==1
value FLAG==1
echoed FLAG==1
value FLAG==1
echoed FLAG==1
value FLAG==
echoed FLAG==Undefined?
- 在所有循环中,通过第一个循环,删除变量
flag
:
set "flag="
- 在第一个
for
循环中删除变量flag
,在第二个循环中for
,首先检查标志是否尚未定义,如果为真,则比较变量,%%~b
然后将set
变量flag
与值进行比较1
:
if not defined flag IF /i "%%~b"=="%%~j" SET "flag=1"
Refer edit
设置其变量标志后,因为%%~b == %%~j
,没有必要在第二次循环中继续与文件的其余行进行比较,因此只需使用goto :label
立即退出循环并继续主循环。
IF /i "%%~b"=="%%~j" (
SET "flag=1"
Goto :skip
)
)
:skip