我无法将文件名从ddmmmyyyy的日期格式更改为mmddyyyy。问题是月份缩写为01DEC2012。有人可以帮我这个代码吗?
答案 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
}