пакетный скрипт для переименования всех файлов меньше текущей даты - PullRequest
0 голосов
/ 29 апреля 2018

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

1
DRS01_773705373_20180329173532680_ALARM_INPUT.JPG.

После переименования:
Cam 1_20180329173532680.jpg

В папке несколько тысяч изображений разного времени, мне нужно переименовать файлы, которые старше текущей даты.

Код:

@echo off
setlocal enableDelayedExpansion
for %%F in (DRS01_773705373_20180329173532680_ALARM_INPUT.jpg) do (
  set "name=%%F"
  ren "!name!" "!name:DRS01=Cam 1!" (stuck here)
)

Мне нужно избавиться от идентификатора 773705373 и_ALARM_INPUT из имен файлов.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Вот моё решение с закомментированными пакетными файлами, которое, конечно, очень похоже на решение, опубликованное 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?

0 голосов
/ 29 апреля 2018
  • Первый для итерации файлов
  • 2-й делится на _, оставляя только 3-й токен
  • if сравнивает первые 8 мест строки даты и времени

Непроверенные:

@echo off & setlocal enableDelayedExpansion
:: Get Date
for /f "tokens=1-3 delims=.+-" %%A in (
  'wmic os get LocalDateTime^|findstr ^^[0-9]'
) do Set Today=%%A

for %%A in (DRS01_*_*_ALARM_INPUT.jpg) do (
  for /f "tokens=3 delims=_" %%B in ("%%A") do (
    set "FileDate=%%B"
    If "!FileDate:~0,8!" lss "%Today:~0,8%" (
      ren "%%A" "Cam 1_%%B%%~xA" 
    )
  )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...