2015-08-27 85 views
0

我正在尝试重命名大量文件。我只是想进一步扩展,从“.pdf.OCR.pdf”到“.PDF” 改变到目前为止,我得到了下面的代码更改Windows批处理文件的扩展名

rem for /r myPDFfolder %%i in (*.pdf.OCR.pdf) do ren "%%i" "%%~ni.pdf" 

但它不会出现与具有多点扩展到工作 - 我究竟做错了什么?

回答

1

扩展名是最后一个点之后的文件名的一部分。

使用字符串替换剥离不需要的部分:

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处理该文件两次或更多次。

+0

我会使用替换'!file:.pdf.OCR.pdf = .pdf!'以完全遵守原来的问题...... – aschipfl

+1

这将是一个过于字面的解释。目标是*剥离不需要的部分。实际上可能会使用更简短的方法:'set name = %%〜ni'和'ren'%% i“”!name:.OCR =!“',所以代码已经多余而且更加明显。 – wOxxOm

+0

...好吧,我同意......无论如何,你应该在整个'set'表达式周围放置''''以避免在文件名中使用'^'或'&'等特殊字符的麻烦;我建议使用''该目录由'dir/S/B/A:-D'解析出来,并用'for/F'解析它的输出,而不是使用'for/R'来确保目录树在迭代之前被枚举;因为你正在修改'for/R'正文中的树,可能会出现冲突(请参阅我的[关于该主题的帖子](http://stackoverflow.com/q/31975093/5047996))... – aschipfl

0

替代解决方案,而无需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)。

+1

在这种情况下,您不必担心文件被重命名两次。请参阅[我的答案](http://stackoverflow.com/a/32282125/1012053) – dbenham

1

不需要批处理文件。来自命令提示符的中等长度的一行代码可以执行此操作。

如果你知道一个事实,那场比赛*.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" 
相关问题