Как определить / получить файл по его метке времени в пакетном файле? - PullRequest
1 голос
/ 05 августа 2020

У меня есть список файлов csv с датой и временем, добавленными как «Account_data_yyyymmdd.csv», которые добавляются ежедневно вместе с его меткой времени в исходный каталог. Мне нужно определить последний файл ie. 'Account_data_2020_08_05.csv' и установить значение в переменной. поэтому я могу передать его как аргумент

Файлы в исходном каталоге

  • Account_data_2020_08_05.csv
  • Account_data_2020_08_04.csv
  • Account_data_2020_08_100 * 10

Мне нужно найти недавно размещенный файл на основе его отметки времени и передать его в качестве входных данных для вызова другого пакетного процесса. Выделенный текст - это аргумент пакетного файла. Как найти последний файл по его метке времени и передать его в качестве аргумента для

echo "start"
call process.bat "C:\CSVDataLod"  AccntDataloadprocess ***"dataAccess.name=C:\SourceDir\ Account_data_%year%_%month%_%date%.csv"***

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Это на удивление легко. Используйте dir с переключателем /on для сортировки по имени (см. dir /? для этого переключателя и других, которые я использовал, если вы не знакомы с ними) и поместите for /f l oop вокруг, чтобы захватить вывод. Следующий код устанавливает переменную %last% для каждой строки вывода, сохраняя только последнюю:

for /f "delims=" %%a in ('dir /a-d /on /b Account_data_*.csv') do set "last=%%a"
echo %last%
0 голосов
/ 06 августа 2020

Самый простой и быстрый способ получить имя CSV-файла с самой последней датой в имени файла - это использовать команду DIR с опцией /O-N, чтобы получить выходные имена CSV-файлов, упорядоченные по имени в обратном порядке. В этом случае имя файла с самым новым именем выводится первым DIR . Вывод DIR должен быть захвачен и обработан с помощью FOR . FOR l oop завершается после запуска другого командного файла с выводом первого имени файла DIR .

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "FileFound="
set "FileNamePattern=Account_data_20??_??_??.csv"
if /I "%~x1" == ".csv" set "FileNamePattern=%~nx1"
for /F "delims=" %%I in ('dir "C:\SourceDir\%FileNamePattern%" /A-D /B /O-N 2^>nul') do (
    echo Processing file %%I ...
    call process.bat "C:\CSVDataLod" AccntDataloadprocess "dataAccess.name=C:\SourceDir\%%I"
    if /I not "%~1" == "/A" goto EndBatch
    set "FileFound=1"
)
if not defined FileFound echo There is no file "%FileNamePattern%" in directory "C:\SourceDir".
:EndBatch
endlocal

Я рекомендую открыть командная строка и запустите

dir "C:\SourceDir\Account_data_20??_??_??.csv" /A-D /B /O-N

Тогда вы узнаете, какие строки обрабатываются FOR . Затем запустите

dir "C:\SourceDir\Account_data_20??_??_??.csv" /A-D /B
dir "C:\SourceDir\Account_data_20??_??_??.csv" /A-D /B /ON

, чтобы увидеть, как DIR выводит имена файлов CSV без указания определенного c порядка, в результате чего печатаются имена файлов, возвращенные файловой системой и явно упорядоченные имя в алфавитном порядке, а не в обратном алфавитном порядке.

Файловая система NTFS возвращает список имен файлов, соответствующих шаблону подстановки в локальном порядке c alphabeti c, в то время как файловые системы FAT, такие как FAT16, FAT32 , exFAT возвращает совершенно неупорядоченные имена файлов. На самом деле все файловые системы возвращают имена файлов в том порядке, в котором они хранятся в таблице файловой системы. Файловые системы используют разные методы добавления имени файла в таблицу файловой системы. Файловые системы FAT всегда добавляют новое имя файла в конец таблицы каталога, в то время как NTFS вставляет новое имя файла в таблицу каталога, используя локальный алгоритм сортировки c alphabeti c.

Прочтите документацию Microsoft о Использование операторов перенаправления команд для объяснения 2>nul. Оператор перенаправления > должен быть экранирован символом вставки ^ в командной строке FOR , чтобы он интерпретировался как буквальный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR который выполняет встроенную dir командную строку в отдельном командном процессе, запущенном в фоновом режиме с %ComSpec% /c и командной строкой в ​​', добавленной в качестве дополнительных аргументов.

Изменить:

Пакетный файл может быть запущен с /a или /A в качестве аргумента для обработки всех CSV-файлов, соответствующих шаблону подстановки, от самого нового к самому старому, а не только к самому новому. Пакетный файл также можно запустить с именем .csv файла в исходном каталоге для обработки этого c CSV-файла вместо самого нового CSV-файла.

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

  • call /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • setlocal /?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...