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

时间:2018-04-29 09:44:54

标签: batch-file

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

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和_ALARM_INPUT。

2 个答案:

答案 0 :(得分:0)

  • 第一个用于迭代文件
  • 第二部分在_处分开,仅留下第三个令牌
  • 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" 
    )
  )
)

答案 1 :(得分:0)

这是我评论的批处理文件解决方案,当然与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% produces different result in batch file when run from scheduled tasks on Windows server 2016上的答案。

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

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

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

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

另请参阅Where does GOTO :EOF return to?上的答案