我的目标是在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或其他。任何帮助将不胜感激。
答案 0 :(得分:0)
只是不要在批处理脚本中使用多行代码块。
@for ... do @call :SubroutineName %%G
@exit /b 0
:Subroutine
rem Whatever.
然后在子程序中完成工作,而不必担心多线程代码块中涉及的所有问题。您会发现使用echo也可以更容易地调试此类代码。
答案 1 :(得分:0)
以下是使用WMIC
和Dir
的一种方法:
@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
。