在嵌套的FOR循环中使用DelayedExpansion

时间:2018-03-13 21:31:10

标签: windows batch-file for-loop nested-loops

我的目标是在PC上列出本地硬盘并在每个硬盘上搜索特定文件。如果找到,则将文件的路径输出到名为" PCNAME.txt"的文本文件中。我的期望如下:

set filename="abc.exe"
set uncpath="%userprofile%\desktop\"
set fullpath=%uncpath%\%computername%.txt

for /f %%a in ('wmic logicaldisk where "description='Local Fixed Disk'" get Caption ^| find ":"') do (
set letter=%%a
cd %letter%\ 

for /R %%f in (%filename%) do @IF EXIST %%f @echo File Location^(s^) Identified: >> %fullpath% & goto :search

:search
for /R %%f in (%filename%) do @IF EXIST %%f set filenew=%%f & call :trim
echo. >> %fullpath%
exit /b

:trim
set filenew=%filenew:"=%
@echo %filenew% >> %fullpath%
)

当删除第一个FOR循环并将当前工作目录更改为C:\ drive时,上述脚本可以正常工作。但我希望它能在所有本地硬盘上运行。经过大量的谷歌搜索,我想这种方法可能是使用DelayedExpansion。我也明白FOR循环中的goto正在取消循环。但我无法完全修复脚本。

我还想知道是否有可能消除" trim"完全标签,而是直接删除双引号"搜索"标签使用DelayedExpansion或其他。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

只是不要在批处理脚本中使用多行代码块。

@for ... do @call :SubroutineName %%G
@exit /b 0
:Subroutine
rem Whatever.

然后在子程序中完成工作,而不必担心多线程代码块中涉及的所有问题。您会发现使用echo也可以更容易地调试此类代码。

答案 1 :(得分:0)

以下是使用WMICDir的一种方法:

@Echo Off
Set "filename=abc.exe"
Set "uncpath=%userprofile%\desktop"
Set "fullpath=%uncpath%\%computername%.txt"

Echo File Location(s) Identified:>"%fullpath%"
Set "_="
(For /F "Skip=1" %%A In (
    'WMIC LogicalDisk Where "DriveType='3'" Get DeviceID 2^>Nul') Do (
    For /F "Delims=" %%B In ('Dir /B/S/A-D-L "%%A\%filename%" 2^>Nul'
    ) Do Set "_=T" & Echo %%B))>>"%fullpath%"
If Not Defined _ Del "%fullpath%"

如果您只想要没有文件名的地点,请将%%B行上的11更改为%%~dpB