Вот моё решение с закомментированными пакетными файлами, которое, конечно, очень похоже на решение, опубликованное LotPings .
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "Folder=%CD%"
if "%Folder:~-1%" == "\" set "Folder=%Folder:~0,-1%"
rem Determine current local date using a region independent method in
rem basic international format YYYYMMDD according to ISO 8601:2004.
for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "CurrentDate=%%I"
set "CurrentDate=%CurrentDate:~0,8%"
rem Process all non hidden files with three underscores in file name and of
rem which file name ends with ALARM_INPUT and having file extension JPG.
rem On each iteration of the loop first is determined the third underscore
rem delimited part from file name which contains the date in first 8 chars.
rem If the current file name has not the current date in file name, the
rem file name is modified to required format.
for /F "delims=" %%I in ('dir "%Folder%\*_*_*_ALARM_INPUT.JPG" /A-D /B /ON 2^>nul') do (
for /F "tokens=3 delims=_" %%J in ("%%I") do set "FileDateNumber=%%J"
if not "!FileDateNumber:~0,8!" == "%CurrentDate%" ren "%Folder%\%%I" "Cam 1_!FileDateNumber!.jpg"
)
endlocal
Этот пакетный файл запускается по умолчанию в текущем каталоге. Каталог можно изменить на каталог пакетного файла, изменив значение %CD%
на %~dp0
во второй строке. И, конечно, также можно указать любой другой каталог во второй строке.
Это решение выше работает только без файла с восклицательным знаком в имени файла.
В противном случае для выполнения этой задачи переименования файлов необходим приведенный ниже пакетный код с использованием подпрограммы.
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Folder=%CD%"
if "%Folder:~-1%" == "\" set "Folder=%Folder:~0,-1%"
rem Determine current local date using a region independent method in
rem basic international format YYYYMMDD according to ISO 8601:2004.
for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "CurrentDate=%%I"
set "CurrentDate=%CurrentDate:~0,8%"
rem Process all non hidden files with three underscores in file name and of
rem which file name ends with ALARM_INPUT and having file extension JPG.
for /F "delims=" %%I in ('dir "%Folder%\*_*_*_ALARM_INPUT.JPG" /A-D-H /B /ON 2^>nul') do call :FileRename "%Folder%\%%I"
endlocal
goto :EOF
rem The subroutine FileRename first gets third underscore delimited part
rem from file name which contains the date in first 8 characters. If the
rem current file name has not the current date in file name, the subroutine
rem renames the file to required format.
:FileRename
for /F "tokens=3 delims=_" %%J in ("%~n1") do set "FileDateNumber=%%J"
if not "%FileDateNumber:~0,8%" == "%CurrentDate%" echo ren %1 "Cam 1_%FileDateNumber%.jpg"
goto :EOF
Подробнее о первом цикле FOR , используемом для получения текущей даты независимо от страны, заданной в настройках «Регион Windows» и «Язык» для используемой в данный момент учетной записи, см. Мой ответ на % date% приводит к другому результату в пакетном файле при запуске из запланированных задач на Windows server 2016 .
Оба пакетных файла используют сравнение строк для сравнения дат, поскольку я не ожидаю, что файл содержит дату в будущем в имени файла. Конечно, можно заменить ==
на LSS
и удалить not
в командной строке IF , чтобы выполнить целочисленное сравнение при сравнении даты в имени файла с текущей датой. Целочисленное сравнение немного медленнее, хотя и не заметно медленнее по сравнению с общим временем выполнения.
Решения используют команду DIR для обработки FOR захваченного списка имен файлов, чтобы избежать возможных проблем, таких как пропуск некоторых имен файлов при использовании напрямую FOR для поиск файлов, соответствующих шаблону подстановки, если файлы хранятся в разделе FAT32 или exFAT.
Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.
echo /?
endlocal /?
for /?
goto /?
if /?
rem /?
ren /?
set /?
setlocal /?
См. Также ответ на Куда возвращается GOTO: EOF?