我正在尝试重命名大量文件。我只是想进一步扩展,从“.pdf.OCR.pdf”到“.PDF” 改变到目前为止,我得到了下面的代码更改Windows批处理文件的扩展名
rem for /r myPDFfolder %%i in (*.pdf.OCR.pdf) do ren "%%i" "%%~ni.pdf"
但它不会出现与具有多点扩展到工作 - 我究竟做错了什么?
我正在尝试重命名大量文件。我只是想进一步扩展,从“.pdf.OCR.pdf”到“.PDF” 改变到目前为止,我得到了下面的代码更改Windows批处理文件的扩展名
rem for /r myPDFfolder %%i in (*.pdf.OCR.pdf) do ren "%%i" "%%~ni.pdf"
但它不会出现与具有多点扩展到工作 - 我究竟做错了什么?
扩展名是最后一个点之后的文件名的一部分。
使用字符串替换剥离不需要的部分:
setlocal enableDelayedExpansion
for /f "eol=* delims=" %%i in ('dir /s /b "r:\*.pdf.OCR.pdf"') do (
set "name=%%~nxi"
ren "%%i" "!name:.pdf.OCR=!"
)
P.S.解析dir
用于在不同的文本被剥离的情况下使代码更健壮,这可能改变了排序顺序并导致for
处理该文件两次或更多次。
替代解决方案,而无需delayed expansion(删除ECHO
实际重命名的文件):
@echo off
rem iterate over all matching files:
for /F "delims=" %%A in (
'dir /S /B /A:-D "myPDFfolder\*.pdf.OCR.pdf"'
) do (
rem "%%~nA" removes last ".pdf"
for /F %%B in ("%%~nA") do (
rem "%%~nB" removes ".OCR" part
for /F %%C in ("%%~nB") do (
rem "%%~nC" removes remaining ".pdf"
ECHO ren "%%~fA" "%%~nC.pdf"
) & rem next %%C
) & rem next %%B
) & rem next %%A
注:目录树通过前for
遍历枚举因为否则的话,一些项目可能会跳过或试图重命名两次(有关该问题,请参阅this post)。
在这种情况下,您不必担心文件被重命名两次。请参阅[我的答案](http://stackoverflow.com/a/32282125/1012053) – dbenham
不需要批处理文件。来自命令提示符的中等长度的一行代码可以执行此操作。
如果你知道一个事实,那场比赛*.pdf.ocr.pdf
所有文件都有这个确切的情况:.pdf.OCR.pdf
,那么你可以使用命令行执行以下操作:
for /r "myPDFfolder" %F in (.) do @ren "%F\*.pdf.ocr.pdf" *O&ren "%F\*.pdf.o" *f
第一重命名删除后.pdf
和第二个删除.OCR
。因为*O
中的目标掩码中的*O
通过最后一次出现的大写O
和*f
通过最后一次出现的小写f
保留原始文件名中的所有内容。请注意,源掩码中的字符不区分大小写。你可以阅读更多关于这是如何工作的How does the Windows RENAME command interpret wildcards?
如果.pdf.ocr.pdf
的情况可以改变,那么上述将惨败。但是,仍然有一个衬垫从在命令行工作:
for /r "myPDFfolder" %F in (*.pdf.ocr.pdf) do @for %G in ("%~nF") do @ren "%F" "%~nG"
%~nF
LOPS了最后.pdf
和%~nG
LOPS关闭.OCR
,留下的.pdf
所需的扩展。
您不必担心文件被重命名两次,因为重命名后的结果不匹配*.pdf.ocr.pdf
,除非原始文件看起来像*.pdf.ocr.pdf.ocr.pdf
。
如果您认为将来可能需要频繁重命名具有复杂模式的文件,那么您应该查看JREN.BAT-正则表达式重命名实用程序。它是纯粹的脚本(混合JScript /批处理),可以从XP以后的任何Windows机器上本机运行。完整的文档嵌入在脚本中。
假设JREPL.BAT是你的PATH中列出的文件夹中,然后将下面这个简单的命令将在命令行工作,仅重命名的情况下在搜索字符串相匹配的文件:
jren "(\.pdf)\.OCR\.pdf$" $1 /s /p "myPDFfolder"
如果要在匹配时忽略大小写,但要强制扩展名为小写,则:
jren "\.pdf\.ocr\.pdf$" ".pdf" /i /s /p "myPDFfolder"
我会使用替换'!file:.pdf.OCR.pdf = .pdf!'以完全遵守原来的问题...... – aschipfl
这将是一个过于字面的解释。目标是*剥离不需要的部分。实际上可能会使用更简短的方法:'set name = %%〜ni'和'ren'%% i“”!name:.OCR =!“',所以代码已经多余而且更加明显。 – wOxxOm
...好吧,我同意......无论如何,你应该在整个'set'表达式周围放置''''以避免在文件名中使用'^'或'&'等特殊字符的麻烦;我建议使用''该目录由'dir/S/B/A:-D'解析出来,并用'for/F'解析它的输出,而不是使用'for/R'来确保目录树在迭代之前被枚举;因为你正在修改'for/R'正文中的树,可能会出现冲突(请参阅我的[关于该主题的帖子](http://stackoverflow.com/q/31975093/5047996))... – aschipfl