如何在一组文件夹中查找最新文件?

时间:2019-06-19 13:48:08

标签: batch-file for-loop cmd

我正在编写一个批处理文件,我需要在其中选择一组文件夹中任何位置的最新导入文件,然后将其复制到其他位置以进行进一步处理。目录树如下所示:

  • c:\ import
    • c:\ import \ 20190612
    • c:\ import \ 20190613
    • c:\ import \ 20190614

大多数时候(但不是每天),导入文件会进入上面具有相应日期的文件夹中的文件夹结构中。该文件是众多文件之一,命名约定为[customerID] _ [随机数] .xml,例如94443_20152245.xml

我尝试使用FOR命令:

FOR /F "delims=|" %%I IN ('DIR "c:\import\94443*.xml" /B /O:D') DO SET 94443=%%I
Copy "c:\import\%94443%" "c:\somewherelse\"

但是,这仅适用于文件夹树中的顶部文件夹。我无法使用最新日期,例如,告诉命令在c:\ import \ 20190614中查找,因为我无法确定文件夹树在该日期接收到该客户的导入文件,因此我需要获取不论日期如何,都是最新的。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir\t w o"

:: Just an exercise - for customers 94440..94446 (there is no data for 94446)
FOR /l %%C IN (94440,1,94446) DO (

 SET "company_%%C="
 rem directories in reverse-order of name (= reverse-date-order) ONLY if files named "customer_something" exist
 FOR /f "delims=" %%d IN ('dir /ad /b /o-n "%sourcedir%"') DO IF EXIST "%sourcedir%\%%d\%%C_*" (
  rem list in reverse-date order (FOR TESTING PURPOSES ONLY, in NAME-ORDER)
  FOR /f "delims=" %%t IN ('dir /a-d /b /o-n "%sourcedir%\%%d\%%C_*"') DO IF NOT DEFINED company_%%C SET "company_%%C=%sourcedir%\%%d\%%t"
 )
 IF NOT DEFINED company_%%C SET "company_%%C=----Missing----"

)

:: display result
SET company_

GOTO :EOF

您需要根据自己的情况更改sourcedir的设置。清单使用适合我系统的设置。

为了便于测试,我只是将不同的客户编号应用于主例程,检查随机创建的文件名树。

基本上,分两个步骤-以相反的名称顺序将子目录列出到%%d,然后依次处理每个%%d,但前提是该子目录包含有关客户的数据,并为其分配名字找到(/on按名称顺序进行测试-您将使用反向日期顺序/o-d),并且一旦设置了变量,就可以忽略其他set次使用{{1}的尝试}

然后显示结果...

答案 1 :(得分:0)

这很完美:

set "srcDir=c:\import\"
set "destdir=c:\somewherelse\"
set "lastmod="

For /f "usebackq delims=" %%a in (`
  powershell -NoP -C "(Get-ChildItem -Path '%srcDir%' -Filter '94443*.xml' -File - 
Recurse | Sort-Object LastWriteTime -Descending | Select-Object -First 1).FullName"
`) Do Set "lastmod=%%a"

If defined lastmod (
   copy "%lastmod%" "%destDir%output.xml"
) else (
   Echo couldn't obtain  file
)