2011-11-11 239 views
0
for /f "tokens=*" %%f in ('dir /ad /s /b "C:\Users\Tin\Desktop\renameFolders"') do (
setlocal enabledelayedexpansion enableextensions 
    set N=%%f 
    set N=!N: =_! 
    ren "%%f" "!N!" 
) 

如何重命名所有文件和子文件夾? 我未能通過循環和重命名所有子文件夾。批處理:重命名所有文件和子文件夾

文件結構: 測試:

file 2.txt 
file 1.txt 
folder 1 
test.bat 

文件夾1:

folder 2 
file 3.txt 

文件夾2: 文件4.txt

+0

檢查這個http://stackoverflow.com/questions/191351/windows-dos-scripting-for-command-to-rename-all-files-in-a-目錄 – Vilva

+0

它是重命名目錄的問題,但它不是文件,還是什麼? –

回答

2

我看到它的方式,你有三個問題:

  1. 使用/ ad開關意味着你將只處理目錄,而不是文件
  2. set N=%%f會導致N到拿到全名,包括路徑,因爲那是什麼dir /b回報
  3. 遞歸需要扭轉。如果重命名「文件夾1」到「FOLDER_1」,那麼在您檢查「文件夾1 /文件夾2」的路徑不再有效。

固定(1)只刪除/ad 定影(2)使用set N=%%~nxf 我還沒有確定如何解決#3。我發現重複的運行與(1)&(2)固定腳本將最終得到改名爲所有文件意外。但我確信有更好的答案。

+0

名稱必須包含完整路徑;否則,第一級以下的文件/文件夾將如何定位?或者在任何級別,如果批處理文件在不同的目錄中啓動? – Aacini

+0

SETLOCAL EnableDelayedExpansion ENABLEEXTENSIONS FOR/F 「delims =」 %% d IN( 'DIR/B/S /廣告')DO( \t SET 「老= %% d」 \t組新老=!= _ ! \t如果不是!新的!==!老了!仁 「!老了!」 「!新的!」 \t ) PAUSE
這有什麼錯我的代碼? –

+0

我可以問更多關於第一部分? pushd和popd有什麼用處?它是否存儲當前目錄?並調用renameFile函數?和彈出?並退出腳本?不知道第一部分...請解釋一下。謝謝。 –

2

這裏的問題是在至極的文件夾重命名必須完成的順序。最深的文件夾必須首先重命名,重命名過程必須向上,直到到達頂層文件夾。做到這一點的唯一方法是通過這個方式來處理每一個現有的文件夾的遞歸子程序:

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.txtfolder 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 /?

+0

CD%1在路徑方面是否與cd %% d相同(或者如您所說,它有助於轉到最深的目錄來完成dir不能做的工作?)?而且,如果我們推送%1(路徑應該放在我放置bat文件的位置),那麼在調用後:ProcessThisFolder(它通過使用「cd %% d」和「cd ..」循環遍歷整個目錄。 ,並且它返回到%1目錄,是嗎?因爲我總是對BATCH中的路徑問題感到困惑。 –

+0

是的,你的描述是正確的。在子程序中,我們也可以使用'pushd %% d'和'popd'而不是'cd %% d'和'cd ..',但在這種情況下,我們確信每個文件夾都比上一個文件夾低一級,所以'pushd'不是必須的。'pushd'用在我們沒有想法在哪裏是當前目錄,並希望稍後返回。 – Aacini

相關問題