如何重命名文件,移动部分文件名和转换日期格式,批处理?

时间:2014-11-30 20:01:00

标签: batch-file cmd filenames rename

我在iPhone和iPad上使用了notability app ipad保存课堂笔记,但它用尴尬的文件名保存它们,如:

" Title Sep 2014,2014 - 2nd Description blah blah.pdf"
"标题2014年10月1日 - 第二个描述blah blah.pdf"

这使得很难按日期对Windows文件资源管理器中的文件进行排序,因为它按字母顺序对其进行排序,而月份是由于文件名而排序的第一件事。

我想将文件名结构更改为:
" YYYY-MM-DD - 标题 - 描述blah blah.pdf"

我假设我需要一个for循环来使用ren命令,但我遇到的困难是读取文件名并更改字符串结构。标题和第二个描述会有所不同,并且由多个单词组成,因此它不能是一个硬编码的字符串,这使得这更加棘手。有人有什么建议吗?感谢。

2 个答案:

答案 0 :(得分:4)

“批次太难了”?我看到喜剧演员又松了......

现在有一些真实的例子会很好,但这应该有效。

@ECHO Off
SETLOCAL
SET "sourcedir=U:\sourcedir\t w o"
FOR %%a IN ("%sourcedir%\*.pdf") DO (
 SET "oname=%%a"
 FOR /f "tokens=1,2*delims=,-" %%c IN ("%%~nxa") DO (
  SET "oldendname=%%e"
  CALL :formdate %%d %%c
 )
)

GOTO :EOF
:: parameters are yyyy unknown* Mon dd
:formdate
SET /a yyyy=%1 2>NUL
IF %ERRORLEVEL% neq 0 GOTO :EOF 
SET "newtitle="
:formloop
SHIFT
IF "%~3" neq "" SET "newtitle=%newtitle% %~1"&GOTO formloop
SET "mm="
FOR %%z IN (
 "Jan=01" "Feb=02" "Mar=03" "Apr=04" "May=05" "Jun=06" 
 "Jul=07" "Aug=08" "Sep=09" "Oct=10" "Nov=11" "Dec=12"
 ) DO FOR /f "tokens=1,2delims==" %%m IN (%%z) DO IF "%%m"=="%1" SET "mm=%%n"
IF NOT DEFINED mm GOTO :EOF 
SET /a dd=100+%2

ECHO(REN "%oname%" "%yyyy%-%mm%-%dd:~-2%%newtitle% -%oldendname%"
GOTO :eof

您需要更改sourcedir的设置以适合您的具体情况。

为了测试目的,所需的REN命令仅为ECHO在您确认命令正确后,将ECHO(REN更改为REN以实际重命名文件。

[编辑:已修复以包含扩展程序]

答案 1 :(得分:0)

使用JREN.BAT第2版的新解决方案

对于那些喜欢正则表达式的人来说,使用JREN.BAT version 2非常简单 - 这是一个混合JScript /批处理命令行实用程序,它通过应用正则表达式搜索重命名文件或文件夹并替换为名称。 JREN.BAT是纯脚本,可​​以在XP以后的任何Windows机器上本机运行。

这个简单的单行班轮将重命名当前目录中的文件:

jren "^(.* )([A-Z][a-z]{2} \d\d?, \d{4}) -" "ts({dt:$2,fmt:'{iso-dt}'})+' - '+$1+'-'" /j /fm *.pdf

添加/P rootPath选项以重命名其他目录中的文件。

添加/S选项以递归方式重命名所有子目录中的文件

如果您担心错误的日期匹配,可以使正则表达式更精确:

jren "^(.* )((?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d\d?, \d{4}) -" "ts({dt:$2,fmt:'{iso-dt}'})+' - '+$1+'-'" /j /fm *.pdf


以下是使用版本1的原始解决方案

以下是使用JREN.BAT的两种替代解决方案:

@echo off
setlocal

set "src=."
if "%~1" neq "" set "src=%~1" 

::         ($1-)    ($2-) ($3-) ($4-) ($5-) ($6-) ($7-) ($8-) ($9-) ($10) ($11) ($12) ($13)  ($14--)  ($15--)($16------------)
set "find=^(.+?) (?:(Jan)|(Feb)|(Mar)|(Apr)|(May)|(Jun)|(Jul)|(Aug)|(Sep)|(Oct)|(Nov)|(Dec)) (\d\d?), (\d{4})((?: - .+)?\.pdf)$"

set "repl=for (i=1; i<=12; i++) if (eval('$'+(i+1))) rtn=$15+'-'+lpad(i,'00')+'-'+lpad($14,'00')+' - '+$1+$16; rtn;"

call jren "%find%" "%repl%" /j /i /p "%src%"

@echo off
setlocal

set "src=."
if "%~1" neq "" set "src=%~1" 

::         ($1-) ($2--------------------------------------------------------------)($3-------------)
set "find=^(.+?) ((?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d\d?, \d{4})((?: - .+)?\.pdf)$"

set "repl=dt=new Date($2); dt.getFullYear()+'-'+lpad(dt.getMonth()+1,'00')+'-'+lpad(dt.getDate(),'00')+' - '+$1+$3;"

call jren "%find%" "%repl%" /j /i /p "%src%"

将上述任一名称为renameNotes.bat,然后使用不带参数的renameNotes重命名当前目录中的文件,或renameNotes somePath重命名特定文件夹中的文件。该脚本可以安全地多次运行 - 它只会重命名需要它的文件。

目前,上述解决方案需要大量用户提供的JScript代码。我想我可能会在不久的将来为JREN.BAT添加一个内置的日期格式化程序,这会使这更简单。