为什么批处理文件for循环只处理变量的第一个值?

问题描述 投票:0回答:1

我正在尝试在所有驱动器上查找特定文件夹。驱动器列表存储在变量“drive_letter”中,路径存储在由等号分隔的变量“loc”中。批处理文件必须检查驱动器和路径的所有组合,但是,下面的代码片段仅检查所有列出的驱动器上的第一个值,然后退出。

@echo off
set drive_letter=a b c d e f g h i j k l m n o p q r s t u v w x y z
set loc=T est=Te st=Tes t
FOR %%A in (%drive_letter%) do (
    FOR /f "delims==" %%a in ("%%A:%loc%") do ( 
        if exist "%%a" ( echo\ && echo Exists - "%%a" ) else ( echo Nonexistent - "%%a" )
    )
)
pause>nul

期望:

Nonexistent - "c:T est"
Nonexistent - "d:T est"
Nonexistent - "e:T est"
Nonexistent - "f:T est"
Nonexistent - "g:T est"
Nonexistent - "h:T est"
Nonexistent - "i:T est"
Nonexistent - "j:T est"
Nonexistent - "k:T est"
Nonexistent - "l:T est"
Nonexistent - "m:T est"
Nonexistent - "n:T est"
Nonexistent - "o:T est"
Nonexistent - "p:T est"
Nonexistent - "q:T est"
Nonexistent - "r:T est"
Nonexistent - "s:T est"
Nonexistent - "t:T est"
Nonexistent - "u:T est"
Nonexistent - "v:T est"
Nonexistent - "w:T est"
Nonexistent - "x:T est"
Nonexistent - "y:T est"
Nonexistent - "z:T est"

Nonexistent - "c:Te st"
Nonexistent - "d:Te st"
Nonexistent - "e:Te st"
Nonexistent - "f:Te st"
Nonexistent - "g:Te st"
Nonexistent - "h:Te st"
Nonexistent - "i:Te st"
Nonexistent - "j:Te st"
Nonexistent - "k:Te st"
Nonexistent - "l:Te st"
Nonexistent - "m:Te st"
Nonexistent - "n:Te st"
Nonexistent - "o:Te st"
Nonexistent - "p:Te st"
Nonexistent - "q:Te st"
Nonexistent - "r:Te st"
Nonexistent - "s:Te st"
Nonexistent - "t:Te st"
Nonexistent - "u:Te st"
Nonexistent - "v:Te st"
Nonexistent - "w:Te st"
Nonexistent - "x:Te st"
Nonexistent - "y:Te st"
Nonexistent - "z:Te st"

Nonexistent - "c:Tes t"
Nonexistent - "d:Tes t"
Nonexistent - "e:Tes t"
Nonexistent - "f:Tes t"
Nonexistent - "g:Tes t"
Nonexistent - "h:Tes t"
Nonexistent - "i:Tes t"
Nonexistent - "j:Tes t"
Nonexistent - "k:Tes t"
Nonexistent - "l:Tes t"
Nonexistent - "m:Tes t"
Nonexistent - "n:Tes t"
Nonexistent - "o:Tes t"
Nonexistent - "p:Tes t"
Nonexistent - "q:Tes t"
Nonexistent - "r:Tes t"
Nonexistent - "s:Tes t"
Nonexistent - "t:Tes t"
Nonexistent - "u:Tes t"
Nonexistent - "v:Tes t"
Nonexistent - "w:Tes t"
Nonexistent - "x:Tes t"
Nonexistent - "y:Tes t"
Nonexistent - "z:Tes t"

实际结果:

Nonexistent - "c:T est"
Nonexistent - "d:T est"
Nonexistent - "e:T est"
Nonexistent - "f:T est"
Nonexistent - "g:T est"
Nonexistent - "h:T est"
Nonexistent - "i:T est"
Nonexistent - "j:T est"
Nonexistent - "k:T est"
Nonexistent - "l:T est"
Nonexistent - "m:T est"
Nonexistent - "n:T est"
Nonexistent - "o:T est"
Nonexistent - "p:T est"
Nonexistent - "q:T est"
Nonexistent - "r:T est"
Nonexistent - "s:T est"
Nonexistent - "t:T est"
Nonexistent - "u:T est"
Nonexistent - "v:T est"
Nonexistent - "w:T est"
Nonexistent - "x:T est"
Nonexistent - "y:T est"
Nonexistent - "z:T est"
windows for-loop batch-file
1个回答
0
投票

您的代码完全按照您的指示执行。
for/f 的默认值是 tokens=1
这就是您只处理第一个位置的原因。 但即使您纠正此问题并处理所有三个位置,您也不会获得预期的输出。
您的代码请求:对于所有驱动器,给出所有位置的结果。 即:第一个驱动器号和第一个位置
第一个驱动器号和第二个位置
第一个驱动器号和第三个位置
第二个驱动器号与第一个位置
等等
接下来是您的代码,经过更改以处理所有位置。

@echo off
set drive_letter=a b c d e f g h i j k l m n o p q r s t u v w x y z
set loc=T est=Te st=Tes t
FOR %%A in (%drive_letter%) do (
    echo "%%A:%loc%"
    FOR /f "tokens=1-3 delims==" %%a in ("%%A:%loc%") do ( 
        echo [%%A] [%%a] [%%b]  [%%c] 
        if exist "%%a" ( echo\ && echo Exists - "%%a" ) else ( echo Nonexistent - "%%a" )
        if exist "%%b" ( echo\ && echo Exists - "%%b" ) else ( echo Nonexistent - "%%b" )
        if exist "%%c" ( echo\ && echo Exists - "%%c" ) else ( echo Nonexistent - "%%c" )
    )
)
pause>nul

您的预期输出表明您想要的是: 对于所有位置,给出所有驱动器的结果。

需要的调整是:
将 2 切换为命令。
将 for/f 更改为不带 /f 的 for
两者本质上是相同的。 for with 的位置只是不同,因为这些是带有空格的字符串,所以你必须将这些字符串封装在双引号中。
在驱动器和位置之间添加反斜杠,以便脚本将使用完整路径进行搜索。

接下来是您可能想要创建的代码。

@echo off
set drive_letter=a b c d e f g h i j k l m n o p q r s t u v w x y z
set loc="T est","Te st","Tes t"

FOR %%a in (%loc%) do ( 
    FOR %%A in (%drive_letter%) do (
        rem echo [%%A] [%%a] [%%~a]
        if exist "%%A:\%%~a" ( echo\ && echo Exists - "%%A:\%%~a" ) else ( echo Nonexistent - "%%A:\%%~a" )
    )
)

pause>nul
© www.soinside.com 2019 - 2024. All rights reserved.