我的查询解决了一个大型图像目录,包含一系列复杂的子目录,需要对文件列表执行查找,并移动所述文件。
我在StackOverflow和其他支持论坛上找到了一些可能的解决方案,这是我目前的解决方案:
@echo off
set Source=C:\users\directory
set Target=C:\users\target
set FileList=C:\users\lookup\list.txt
echo.
if not exist "%Source%" echo Source folder "%Source%" not found & goto Exit
if not exist "%FileList%" echo File list "%FileList%" not found & goto Exit
if not exist "%Target%" md "%Target%"
for /F "delims=" %%a in ('type "%FileList%"') do move "%Source%\%%a" "%Target%"
:Exit
echo.
echo press the Space Bar to close this window.
pause > nul
这完全正常,但只针对父目录。如何从父目录中自上而下搜索批处理脚本并查找查找列表中提供的所有匹配文件?
答案 0 :(得分:0)
以下是代码的改进版本,包括递归搜索源目录的解决方案。为此,我假设目标目录是平面的,因此不会从源目录复制子目录。所以这是代码:
@echo off
set "Source=C:\users\directory"
set "Target=C:\users\target"
set "FileList=C:\users\lookup\list.txt"
echo/
if not exist "%Source%" echo Source folder "%Source%" not found & goto :Quit
if not exist "%FileList%" echo File list "%FileList%" not found & goto :Quit
2> nul md "%Target%"
for /F usebackq^ delims^=^ eol^= %%a in ("%FileList%") do (
for /F "delims=" %%b in ('dir /B /S /A:-D "%Source%\%%a"') do (
move "%%b" "%Target%"
)
)
:Quit
echo/
echo Press the Space bar to close this window.
pause > nul
除了一些小的语法改进之外,主要的变化是额外的嵌套for /F %%b
循环,它解析dir
命令的输出,后者又搜索{{1}给出的每个文件名。也在源目录的子目录中。
如果您希望将源目录中的相应子目录复制到目标目录,因此目标目录是递归的,则需要调整脚本:
%%a
这就是我所做的:
@echo off
set "Source=C:\users\directory"
set "Target=C:\users\target"
set "FileList=C:\users\lookup\list.txt"
echo/
if not exist "%Source%" echo Source folder "%Source%" not found & goto :Quit
if not exist "%FileList%" echo File list "%FileList%" not found & goto :Quit
for /D %%d in ("%Source%") do set "Source=%%~fd"
2> nul md "%Target%"
for /F usebackq^ delims^=^ eol^= %%a in ("%FileList%") do (
for /F "delims=" %%b in ('dir /B /S /A:-D "%Source%\%%a"') do (
set "Item=%%b"
set "Parent=%%~dpb."
setlocal EnableDelayedExpansion
set "Parent=!Parent:*%Source%=.!"
2> nul md "!Target!\!Parent!"
move "!Item!" "!Target!\!Parent!"
endlocal
)
)
:Quit
echo/
echo Press the Space bar to close this window.
pause > nul
,它只执行从给定路径到源目录的完整绝对和已解析路径;这是必要的,因为在路径上进行了一些字符串操作(例如,for /D %%d in ("%Source%") do set "Source=%%~fd"
相当于C:\USERS\.\directory
作为路径,尽管它们是不同的字符串; C:\Users\any\..\Directory
命令行解析了这些路径到for /D
); C:\users\directory
循环内部,for /F %%b
存储在变量%%b
中,构成完整路径; Item
存储父目录的完整路径,并附加Parent
;例如,如果当前项为\.
,则C:\users\directory\subdir\file.ext
保留Parent
; C:\users\directory\subdir\.
和Item
已在同一代码块中设置和;它通常不会启用但在循环中切换,以便在路径中出现感叹号时不会造成任何麻烦; Parent
删除set "Parent=!Parent:*%Source%=!"
中存储的路径的源目录;例如,当源目录为Parent
时,Parent
路径C:\users\directory\subdir\.
变为.\subdir\.
,因此C:\users\directory
变为相对的; Parent
确保目标目录中存在2> nul md "!Target!\!Parent!"
目录(Parent
抑制潜在的错误消息); 2> nul
且目标目录为C:\users\directory\subdir\file.ext
时,它将移至目录C:\users\target
,相当于C:\users\target\.\subdir\.
; 请注意,源目录不得包含任何C:\users\target\subdir
和!
字符,以使脚本正常工作!