查找包含特定文件的最新文件夹

时间:2017-11-08 13:29:19

标签: batch-file scripting batch-processing

我需要搜索包含多个文件夹的目录并检查最新文件(.exe)并将其复制到另一个位置。

SET "src_root"
SET "tgt_path"
DIR "%src_root%" /B /AD /O-D /TC > "%TEMP%\dirlist.tmp"
< "%TEMP%\dirlist.tmp" SET /P last_dir=
XCOPY "%src_root%\%last_dir%\*.exe" "%tgt_path%"** 

此代码可以帮助我复制最新文件夹中的EXE文件,但是如果最新文件夹中没有EXE,我需要从包含最新EXE的文件夹中复制它,任何人都可以帮我解决吗? / p>

1 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL
SET "sourcedir=c:\sourcedir"
SET "filename="

FOR /f "delims=" %%a IN (
 'dir /s /b /a-d "%sourcedir%\neo.7z" '
 ) DO SET "filename=%%a"&set "dirname=%%~dpa"&goto found1

ECHO NOT found!
GOTO :eof

:found1
FOR /f "delims=" %%a IN (
 'dir /s /b /a-d "%sourcedir%\neo.7z" '
 ) DO IF /i "%dirname%" neq "%%~dpa" FOR /f %%s IN ('XCOPY /y /L /D "%filename%" "%%~dpa"') DO IF "%%s"=="0" SET "filename=%%a"&set "dirname=%%~dpa"&goto found1

ECHO latest file is "%filename%"

GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。

我使用名为neo.7z的文件进行测试 - 我相信在你描述的情况下你应该有一个固定的文件名 - 毫无疑问这些目录不会被* .exe文件塞进来。

它非常行人,但会完成这项工作。

基本上,在所需的目录树中查找具有所需名称的任何文件,并在filename中的dirname目录中记录该名称。

使用该文件名作为基础,尝试xcopy覆盖其他所有匹配的文件名。使用/L标志仅列出列表,使用/y标志删除用户干预。如果返回1 file(s) copied,f只选择第一个标记到%%s,则所选文件稍后。 0 file(s) copied%%s设置为0并表示所选文件较早,因此请选择较新的文件和目录名并重新启动。

我会留下一个用户练习来加快速度。 (建议如果感兴趣:delayedexpansion,子程序和retain-new-startpoint)

修订版[大约快5倍]

@ECHO OFF
SETLOCAL
SET "sourcedir=c:\sourcedir"
SET "filename="

FOR /f "delims=" %%a IN (
 'dir /s /b /a-d "%sourcedir%\neo.7z" '
 ) DO SET "candidate=%%a"&CALL :latest

ECHO latest file is "%filename%"
GOTO :eof

:latest
IF NOT DEFINED filename GOTO selectnew

FOR /f %%s IN ('XCOPY /y /L /D "%filename%" "%candidate%"') DO IF "%%s"=="1" goto :eof

:selectnew
SET "filename=%candidate%"

GOTO :EOF

此修订版避免了重复的目录扫描。对于每个匹配的文件名,使用xcopy /L方法将新找到的文件与先前找到的文件进行比较,如果新的候选文件是新的候选项,则选择新的候选文件。继续直到所有匹配的名称都经过测试。