我有 2 个文件,其中一个包含特定关键字,另一个包含路径列表。我想从第一个文件列表中搜索关键字,然后将其放入文件路径列表中,如果找到,则将文件从指定的文件路径复制到特定的目标文件夹。
第一个文件内容
Keyword1
Keyword2
Keyword3
Keyword4
第二个文件内容
\\server\path...\Keyword1.txt
\\server\path...\Keyword1_0_1.txt
\\server\path...\Keyword2_0_1.txt
\\server\path...\Keyword2_1_9.txt
\\server\path...\Keyword3_1_0_1.txt
我必须为此目的编写 Windows 批处理脚本。
============================================================
抱歉@pimp-juice-it,我不确定如何粘贴截图。因此复制粘贴以下输出 -
d:\Temp_Script\Script>FOR /R "D:\Temp_Script\Source\33.txt" %G IN (55*) DO ECHO "55" d:\Temp_Script\Script>CALL :FileExist "55" "D:\Temp_Script\Source\44.txt" d:\Temp_Script\Script>FOR /R "D:\Temp_Script\Source\44.txt" %G IN (55*) DO ECHO "55" d:\Temp_Script\Script>CALL :FileExist "55" "D:\Temp_Script\Source\55.txt" d:\Temp_Script\Script>FOR /R "D:\Temp_Script\Source\55.txt" %G IN (55*) DO ECHO "55" d:\Temp_Script\Script>CALL :FileExist "55" "D:\Temp_Script\Source\55 - 复制 (2).txt" d:\Temp_Script\Script>FOR /R "D:\Temp_Script\Source\55 - 复制 (2).txt" %G IN (55*) DO ECHO "55" d:\Temp_Script\Script>CALL :FileExist "55" "D:\Temp_Script\Source\55 - 复制.txt"
如您所见,关键字“55”存在于 UNC 中,但 FOR 循环中的条件仍未验证为 True,因此直接转到下一个 UNC。以下是代码 -
:FileExist FOR /R "%~2" %%G IN (%~1*) DO ECHO "%~1"
答案1
您可以循环遍历“关键字”列表一次,并使用迭代的关键字值以及一些括起来的通配符作为搜索字符串IE *<Keyword>*
。您可以从其文件列表遍历每个 UNC 路径值的目录树,并仅对与搜索字符串“关键字”匹配的目录树执行复制操作。
但本质上……
批处理脚本
@ECHO ON
SET "strList=\\server\Folder\Path\SearchStrings.txt"
SET "pathList=\\server\Folder\Path\UNCPaths.txt"
SET "targetPath=\\server\target\folder\path"
FOR /F "USEBACKQ TOKENS=*" %%S IN ("%strList%") DO CALL :Paths "%%~S"
PAUSE
EXIT
:Paths
FOR /F "USEBACKQ TOKENS=*" %%P IN ("%pathList%") DO CALL :FileExist "%~1" "%%~P"
GOTO :EOF
:FileExist
FOR /R "%~2" %%C IN (*%~1*) DO XCOPY /F /Y "%%~C" "%targetPath%\"
GOTO :EOF
更多资源
-
CALL 命令会将控制权连同任何指定的参数一起传递给指定标签后的语句。要退出子程序,请指定
GOTO:eof
此项,将控制权转移到当前子程序的末尾。 -
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters] Walks the directory tree rooted at [drive:]path, executing the FOR statement in each directory of the tree. If no directory specification is specified after /R then the current directory is assumed. If set is just a single period (.) character then it will just enumerate the directory tree.