我正在嘗試重命名大量文件。我只是想進一步擴展,從「.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