【问题标题】:Finding a latest folder that contains a specific file查找包含特定文件的最新文件夹
【发布时间】:2018-04-21 05:12:34
【问题描述】:

我需要搜索一个包含多个文件夹的目录并检查最新的文件(.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的文件夹中复制它,谁能帮帮我?

【问题讨论】:

  • 哦,我一定是累了。我的坏

标签: batch-file scripting batch-processing


【解决方案1】:
@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

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

我将把它留给用户练习以加快速度。 (感兴趣的建议:delayedexpansion、subroutine 和 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 方法将新找到的文件与先前找到的文件进行比较,如果新的候选文件较晚,则选择新的候选文件。继续,直到所有匹配的名称都经过测试。

【讨论】:

  • 这完美!但是现在我有一个小故障,因为我的目录太大,批处理需要太多时间才能找到最新的文件夹,有什么建议可以解决这个问题吗?
猜你喜欢
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 2012-09-22
  • 2012-05-22
  • 2013-12-25
  • 2020-04-02
  • 1970-01-01
相关资源
最近更新 更多