我在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命令,但我遇到的困难是读取文件名并更改字符串结构。标题和第二个描述会有所不同,并且由多个单词组成,因此它不能是一个硬编码的字符串,这使得这更加棘手。有人有什么建议吗?感谢。
答案 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添加一个内置的日期格式化程序,这会使这更简单。