Простое решение может быть
@echo off
setlocal enableextensions disabledelayedexpansion
set "root=K:\path\tp\source\dir"
set "mask=*.ext"
for %%r in ("%root%\.") do for /f "tokens=2,*" %%a in ('
robocopy "%%~fr" "%%~fr" "%mask%" /njh /njs /nc /ns /ts /s /ndl /nocopy /is /r:0 /w:0 /l
^| sort /r
^| cmd /v /e /c"(set /p .=&echo(!.!)"
') do set "lastFile=%%b"
echo Last file : "%lastFile%"
Этот код использует robocopy
для генерации списка файлов с префиксом временной метки (коммутаторы просто не запрашивают ни заголовка задания, ни сводки задания, ни класса файла,нет размера файла, метка времени, рекурсивно, нет списка каталогов, нет копии информации каталога, включаются те же файлы, нет повторов, нет ожидания, не копировать только генерировать список).
Этот список с префиксом времени (UTF yyyy/mm/dd hh:mm:ss
последняя запись в файл) затем сортируется в обратном порядке, чтобы получить последний файл в первой строке.Эта строка извлекается с отдельным экземпляром cmd
(это позволяет избежать проблем со временем при чтении длинных списков данных for /f
), поэтому for /f
читает только одну строку.
Поскольку строки robocopy
содержат дату, время и имя файла, для извлечения этого последнего поля мы просим for /f
извлечь два токена: один, содержащий час (будет храниться в %%a
) и оставшийся текст до конца строки (сохраняется в %%b
)
Дополнительный for %%r
включен только для предотвращения обычной проблемы с использованием robocopy
.Поскольку мы цитируем пути для предотвращения проблем с пробелами, мы должны убедиться, что пути не заканчиваются обратной косой чертой, которая будет экранировать закрывающую кавычку пути и приводить к сбою команды.