批处理脚本,用于重命名所有小于当前日期的文件



我正在尝试重命名文件夹中小于当前日期的所有文件。 我正在尝试以以下格式重命名图像文件。

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)
)

我需要从文件名中删除 ID 773705373 and_ALARM_INPUT。

这是我注释的批处理文件解决方案,当然与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%System32wbemwmic.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

默认情况下,此批处理文件在当前目录中运行。可以通过在第二行中将目录修改为%~dp0 %CD%来更改为批处理文件的目录。当然,也可以在第二行中指定任何其他目录。

上述解决方案仅适用于文件名中没有感叹号的文件。
否则,此文件重命名任务需要以下使用子例程的批处理代码。

@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%System32wbemwmic.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

有关用于在 Windows 区域和当前使用的帐户的语言设置中设置的国家/地区中获取当前日期的独立性的第一个 FOR 循环的详细信息,请参阅我的答案 为什么 %date% 在按计划任务执行的批处理文件中产生不同的结果?

两个批处理文件都使用字符串比较来比较日期,因为我不希望文件在文件名中包含将来的日期。当然,可以通过LSS替换==并在IF命令行中删除not,以在将文件名中的日期与当前日期进行比较时运行整数比较。整数比较稍慢,但与总执行时间相比并不明显慢。

这些解决方案使用命令 DIR 通过 FOR 处理捕获的文件名列表,以避免可能出现的问题,例如跳过某些文件名,直接使用 FOR 搜索与通配符模式匹配的文件,以防文件存储在 FAT32 或 exFAT 分区上。

要了解使用的命令及其工作原理,请打开命令提示符窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • ren /?
  • set /?
  • setlocal /?

另请参阅GOTO :EOF返回何处?

  • 第一个用于迭代文件
  • 第 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" 
    )
  )
)

最新更新