将文件的日期格式从DDMMMYYYY更改为MMDDYYYY

时间:2016-03-24 20:34:50

标签: date batch-file

我无法将文件名从ddmmmyyyy的日期格式更改为mmddyyyy。问题是月份缩写为01DEC2012。有人可以帮我这个代码吗?

4 个答案:

答案 0 :(得分:2)

注意 - 我强烈建议您使用YYYYMMDD格式而不是MMDDYYYY。这将使您能够按时间顺序对文件进行排序。但我的回答将按您的要求格式化为MMDDYYYY。

我会使用JREN.BAT - a regular expression file renaming utility with date/time functionality。它是纯脚本(混合JScript /批处理),可以在任何Windows机器上从XP开始本地运行。

我假设您的日期使用英文3个字母缩写。

以下简单命令将在测试模式下重命名文件,这意味着它将显示如何在不实际执行任何操作的情况下重命名文件。删除/T选项以实际重命名文件。

jren "\d\d[a-zA-Z]{3}\d{4}" "ts({dt:$0,fmt:'{MM}{DD}{YYYY}'})" /j /t

上述问题是它可以轻松地尝试重命名实际上不包含日期的文件。例如,6412DEC2016875具有嵌入其中的日期格式,但它可能不是日期。或者99ABC1234之类的东西与搜索模式相匹配,但显然它不是日期,JREN命令也会失败。

您可以使用更复杂的正则表达式搜索来匹配真实日期。以下仅匹配英文3个字符月缩写,如果在一天之前或一年之后有一个额外的数字,则忽略可能的日期字符串。但是,如果找到像42这样的无效日期,这仍然可能会失败。

jren "(^|\D)(\d\d(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d{4})(?=\D|$)" "$1+ts({dt:$2,fmt:'{MM}{DD}{YYYY}'})" /j /i /t

如果将命令放在批处理脚本中,则必须使用CALL JREN。

答案 1 :(得分:1)

未经测试 (已编辑但尚未测试)

setlocal enableDelayedExpansion
set "months=JAN-01 FEB-02 MAR-03 APR-04 MAY-05 JUN-06 JUL-07 AUG-08 SEP-09 OCT-10 NOV-11 DEC-12"
for /f "tokens=* delims=" %%a in ('dir /b /a:-d^|findstr /i  /r "[0-9][0-9][A-Z][A-Z][A-X][0-9][0-9][0-9][0-9]*"') do (
  set "filename=%%~a"
  set "datepart=!filename:~0,9!"
  set "rest=!filename:~9!"
  set "day=!filename:~0,2!"
  set "mon=!filename:~2,3!"
  for %%# in (%months%) do (
     for /f "tokens=1,2 delims=-" %%x in ("%%#") do (
        if /I !mon! equ %%x (
            set "!mon2!=%%y"
        )
     )
  )

  set "year=!filename:~5,4!"
  rem remove the "echo" to activate renaming
  echo ren "!datepart!!rest!" "!mon2!!day!!year!!rest!"

)

答案 2 :(得分:1)

@echo off
setlocal EnableDelayedExpansion

rem Define the array to convert month names to month numbers
set m=100
for %%m in (JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC) do (
   set /A m+=1
   set "month[%%m]=!m:~1!"
)
rem Previous FOR is equivalent to: set "month[JAN]=01", set "month[FEB]=02", ...

rem Process the files
for %%f in (*.*) do (
   set "name=%%f"
   for %%m in (!name:~2,3!) do if defined month[%%m] (
      ECHO ren "%%f" "!month[%%m]!!name:~0,2!!name:~5!"
   ) else (
      echo The file "%%f" have not DDMMMYYYY format
   )
)

答案 3 :(得分:0)

最短的解决方案是使用PowerShell's date formatting。这是一个如何转换该字符串格式的简化演示。在cmd行输入:

powershell "([datetime]'01DEC2012').ToString('MMddyyyy')"

输出:

  

12012012

从那里,你可以regexp匹配第一种格式,然后用DateTime对象的ToString()替换替换所有匹配。用.bat扩展名保存它并给它一个镜头。

<# : batch portion
@echo off & setlocal

rem // re-evaluate self with PowerShell
powershell -noprofile "iex (${%~f0} | out-string)"
goto :EOF

: end batch / begin PowerShell polyglot code #>

# Get all files in the current directory.  For each, check for regexp matching
# [0-9]{2}[a-z]{3}[0-9]{4}.  If matched, cast the match as a DateTime object,
# convert its format, and rename the matched file

gci | ?{ $_.Name -match "\d\d[a-z]{3}\d{4}" } | %{
    $target = ([datetime]$matches[0]).ToString("MMddyyyy")
    $newname = $_.Name -replace $matches[0], $target
    ren $_.FullName $newname
    "{0} -> {1}" -f $_.Name, $newname
}