【发布时间】:2016-01-14 21:06:35
【问题描述】:
我正在尝试运行一个批处理文件,该批处理文件将递归搜索驱动器以查找我正在寻找的特定文件的列表。我相信我几乎要失望了,但递归部分有问题。
现在,我正在根据我读过的其他线程创建的两个批处理文件之间工作。
运行此批处理文件时,我希望该命令打开位于 LISTFOLDER 中的文本文件并读取此文本文件中的所有文件名。下面的脚本做得很好。以下脚本的唯一问题是它不会通过 FILESPATH 递归搜索。
@echo off
set LISTFOLDER=C:\vbk\txt\test
set FILESPATH=C:\
set DESTPATH=C:\vbk\dest\test
for /f "tokens=*" %%i in ('dir /b ^"%LISTFOLDER%\*.txt^"') do (call :COPY_FILES "%LISTFOLDER%\%%i")
pause
exit
:COPY_FILES
for %%i in (%1) do set DEST=%%~ni
for /f "usebackq delims==" %%i in (%1) do echo xcopy /qv "%FILESPATH%\%%i" "%DESTPATH%\*"
在做了更多研究后,我发现了一个通过 FILESPATH 递归搜索但不会读取文本文件的命令,它似乎是在搜索文本文件的整个路径(例如 C:\vbk\txt\test \test.txt) 与文本文件中的信息。
@echo off
set LISTFOLDER=C:\vbk\txt\test
set FILESPATH=C:\
set DESTPATH=C:\vbk\dest\test
for /f "tokens=*" %%i in ('dir /b ^"%LISTFOLDER%\*.txt^"') do (call :COPY_FILES "%LISTFOLDER%\%%i")
pause
exit
:COPY_FILES
for %%i in (%1) do set DEST=%%~ni
for /r %FILESPATH% %%I in (%1) do echo xcopy /qvs "%%I" "%DESTPATH%\*"
以下是位于 LISTFOLDER 中的 .txt 文件的一个小示例。
01PNK2.PVD
01PR52.PVD
01PVN19.PVD
01PW07S.PVD
01Q0G19.PVD
01Q0W2.PVD
01Q102.PVD
01Q182.PVD
01Q1L2.PVD
...
任何关于我如何实现这一点的建议将不胜感激。
【问题讨论】:
-
您的子程序
:COPY_FILES中的第一个for循环没有用;无论如何,问题是for /R似乎只有在集合中使用通配符(*或?)的情况下才能访问文件系统(即()中in之后的部分);要解决这个问题,您可以在子例程中使用以下命令行:for /R "%FILESPATH%" %%I in ("%~1*") do if /I "%~nx1"=="%%~nxI" ECHO xcopy /Q /V /S "%%~fI" "%DESTPATH%\" -
首先,感谢@aschipfl 的回复。我明白
:COPY_FILES是不必要的。当替换子程序行(我假设这是上面每个示例中的最后一行)并运行批处理文件时,它似乎没有做任何事情。我是做错了什么还是把你的子程序放在了错误的地方?再次感谢您的帮助。 -
我刚刚意识到应该更改第一行
for /F:for /F "usebackq delims=" %%i in ("%LISTFOLDER%\listfile.txt") do (call :COPY_FILES "%%~i")(请注意,您需要在此处指定文本文件并且不要使用@ 987654335@!)
标签: windows batch-file recursion