2015-08-27 121 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" 
相關問題