查找包含特定文件的最新文件夹
Finding a latest folder that contains a specific file
我需要搜索包含多个文件夹的目录并检查最新的文件 (.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的文件夹中复制它,谁能帮帮我?
@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
标志消除用户干预。如果 return 是 1 file(s) copied
,f 其中只有第一个标记被 select 编辑到 %%s
中,那么选择的文件在后面。 0 file(s) copied
将 %%s
设置为 0
,这意味着选择的文件较早,因此 select 较新的文件和目录名称并重新启动。
我将把它留作用户练习以加快速度。 (如果有兴趣,建议:延迟扩展、子例程和保留新起点)
改版[快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
方法将新找到的文件与先前找到的文件进行比较,如果新文件较晚,则 select 新的候选文件。继续,直到所有匹配的名称都已测试。
我需要搜索包含多个文件夹的目录并检查最新的文件 (.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的文件夹中复制它,谁能帮帮我?
@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
标志消除用户干预。如果 return 是 1 file(s) copied
,f 其中只有第一个标记被 select 编辑到 %%s
中,那么选择的文件在后面。 0 file(s) copied
将 %%s
设置为 0
,这意味着选择的文件较早,因此 select 较新的文件和目录名称并重新启动。
我将把它留作用户练习以加快速度。 (如果有兴趣,建议:延迟扩展、子例程和保留新起点)
改版[快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
方法将新找到的文件与先前找到的文件进行比较,如果新文件较晚,则 select 新的候选文件。继续,直到所有匹配的名称都已测试。