我正在编写一个批处理文件,我需要在其中选择一组文件夹中任何位置的最新导入文件,然后将其复制到其他位置以进行进一步处理。目录树如下所示:
大多数时候(但不是每天),导入文件会进入上面具有相应日期的文件夹中的文件夹结构中。该文件是众多文件之一,命名约定为[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中查找,因为我无法确定文件夹树在该日期接收到该客户的导入文件,因此我需要获取不论日期如何,都是最新的。有什么建议吗?
答案 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
)