批处理:使用查找文件搜索目录树并移动文件

时间:2016-12-06 16:52:11

标签: batch-file move

我的查询解决了一个大型图像目录,包含一系列复杂的子目录,需要对文件列表执行查找,并移动所述文件。

我在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

这完全正常,但只针对父目录。如何从父目录中自上而下搜索批处理脚本并查找查找列表中提供的所有匹配文件?

1 个答案:

答案 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;
  • delayed variable expansion已启用,因为变量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! 字符,以使脚本正常工作!