Как найти самый новый файл многих из множества папок? - PullRequest
0 голосов
/ 19 июня 2019

Я пишу командный файл, в котором мне нужно выбрать самый новый из нескольких файлов импорта, который может находиться в любом месте набора папок, и скопировать его в другое место для дальнейшей обработки. Дерево каталогов выглядит так:

  • C: \ импорт
    • c: \ import \ 20190612
    • c: \ import \ 20190613
    • C: \ импорт \ 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, потому что я не могу быть уверен, что дерево папок получило файл импорта для этого клиента на эту дату, мне нужно получить новейший независимо от даты. Есть предложения?

1 Ответ

1 голос
/ 19 июня 2019
@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 попытки с использованием if not defined

Затем отобразите результат ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...