Windows 批处理 For 循环-变量未设置

Windows 批处理 For 循环-变量未设置

编辑:看来我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.txtNoMatchB.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 /iand ~(“ %%~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?
  1. 在所有循环中,通过第一个循环,删除变量flag
set "flag="
  1. 在第一个for循环中删除变量flag,在第二个循环中for,首先检查标志是否尚未定义,如果为真,则比较变量,%%~b然后将set变量flag与值进行比较1
 if not defined flag IF /i "%%~b"=="%%~j" SET "flag=1"
  1. Refer edit设置其变量标志后,因为%%~b == %%~j,没有必要在第二次循环中继续与文件的其余行进行比较,因此只需使用goto :label立即退出循环并继续主循环。
    IF /i "%%~b"=="%%~j" (
       SET "flag=1"
       Goto :skip
       )   
  )

 :skip

相关内容