這裏的問題是在至極的文件夾重命名必須完成的順序。最深的文件夾必須首先重命名,重命名過程必須向上,直到到達頂層文件夾。做到這一點的唯一方法是通過這個方式來處理每一個現有的文件夾的遞歸子程序:
Rename the files in this folder.
For each folder in this folder:
Process it recursively.
Rename it.
另外請注意,並非所有的文件/文件夾必須被重命名,只是那些有空格的名稱;否則REN命令會發出錯誤。下面的批處理文件採取在第一個參數的頂級文件夾到過程:
@echo off
setlocal EnableDelayedExpansion EnableExtensions
pushd %1
call :ProcessThisFolder
popd
exit /b
:ProcessThisFolder
REM Rename the files in this folder.
for %%f in (*.*) do (
set "old=%%f"
set new=!old: =_!
if not !new! == !old! ren "!old!" "!new!"
)
REM For each folder in this folder:
for /D %%d in (*) do (
REM Process it recursively.
cd %%d
call :ProcessThisFolder
cd ..
REM Rename it.
set "old=%%d"
set new=!old: =_!
if not !new! == !old! ren "!old!" "!new!"
)
EDIT
與原方法的問題是將執行中的至極重命名的順序。假設的dir /s /b ...
結果是:
C:\Users\Tin\Desktop\renameFolders\file 1.txt
C:\Users\Tin\Desktop\renameFolders\file 2.txt
C:\Users\Tin\Desktop\renameFolders\folder 1
C:\Users\Tin\Desktop\renameFolders\folder 1\file 3.txt
C:\Users\Tin\Desktop\renameFolders\folder 1\folder 2
當線路3被處理folder 1
被重命名爲folder_1
,所以在這一點在管路4和5的名稱不再有效。第一重命名必須在file 3.txt
和folder 2
來完成,然後繼續向上上面的文件夾,但dir
命令顯示的行按字母順序進行排序,並對其他可用的命令不在這種情況下幫助。
上述計劃的第一部分,以這種方式工作:
pushd %1 Save current directory and do a CD %1
call :ProcessThisFolder Call the subroutine defined in this same file below
popd Do a CD to the directory saved by previous PUSHD
exit /b Terminate here this Batch file; otherwise the lines
. . . below would be executed again
您可以用/執行它審查的任何命令的操作?參數,例如:pushd /?
。
檢查這個http://stackoverflow.com/questions/191351/windows-dos-scripting-for-command-to-rename-all-files-in-a-目錄 – Vilva
它是重命名目錄的問題,但它不是文件,還是什麼? –