2012-11-30 41 views
0

我有幾個目錄,命名爲「A」,「B」,「C」,等子目錄的文件。每個文件都包含一些文件。我喜歡使用目錄名稱加在每個目錄以1開始的索引號來重命名中的每個目錄中的文件,與左零填充到3的寬度例如: Sub目錄A具有3個文件,並且它們會被重新命名如:重命名使用子目錄名稱以重新開始遞增的數字爲每個子目錄

A_001.dat 
A_002.dat 
A_003.dat 

Sub目錄B有2個文件,而且應該更名爲:

B_001.dat 
B_002.dat 

等。這些文件將被移至主目錄。我有以下批處理文件,但似乎無法增加數字。請幫忙。

@echo off 

set HomeFolder=%CD% 
set OldExt=TXT 
set NewExt=DAT 

setlocal ENABLEDELAYEDEXPANSION 
for /f "delims=" %%a in ('dir *.%OldExt% /b /s') do (
    set i=1 
    for /f "delims=" %%b in ("%%~dpa\.") do (
     set pad=00!i! 
     set str=!pad:~-3! 
     echo move /b "%%a" "%HomeFolder%\%%~nxb_!str!.%NewExt%" 
     set /A i=!i!+1 
) 
) 
endlocal 
pause 

和正確的答案是:!

@echo off 

set HomeFolder=%CD% 
set OldExt=TXT 
set NewExt=TIF 
set i=1 
set Folder= 
set LastFolder= 

setlocal ENABLEDELAYEDEXPANSION 

for /f "delims=" %%a in ('dir *.%OldExt% /b /s') do (
    for /f "delims=" %%b in ("%%~dpa\.") do (
     set Folder=%%~nxb   
     if NOT !Folder!==!LastFolder! (set /A i=1) 
     set LastFolder=!Folder! 
     set pad=00!i! 
     set str=!pad:~-3! 
     copy /b "%%a" "%HomeFolder%\%%~nxb_!str!.%NewExt%" 
     Set /A i+=1 
    ) 
) 

endlocal 

回答

1

在循環或括號表達你需要使用延遲擴展

集/變量=變量+1

但是您需要使用setlocal ENABLEDELAYEDEXPANSION激活此功能,並使用匹配的本地終端重置該功能

嘗試以下方法:

@echo off 

set HomeFolder=%CD% 
set OldExt=TXT 
set NewExt=DAT 

setlocal ENABLEDELAYEDEXPANSION 

for /f "delims=" %%a in ('dir *.%OldExt% /b /s') do (
set i=1 
for /f "delims=" %%b in ("%%~dpa\.") do (
    set pad=00%i% 
    set str=%pad:~-3% 
    echo move /b "%%a" "%HomeFolder%\%%~nxb_%str%.%NewExt%" 
    set /A i+=1 
) 
) 

endlocal 

pause 
+0

試了一下,沒有工作,結果都是一樣的 move/b「C:\ Test \ A \ 001.txt」「C:\ Test \ A_.DAT」 move/b「C:\ Test \ A \ 002.txt」「C:\ Test \ A_。 DAT「 move/b」C:\ Test \ A \ 003.txt「」C:\ Test \ A_.DAT「 move/b」C:\ Test \ A \ 004.txt「」C:\ Test \ A_DAT「 move/b」C:\ Test \ B \ 001.txt「」C:\ Test \ B_.DAT「 move/b」C:\ Test \ B \ 002.txt「」C:\ Test \ B_.DAT「 move/b」C:\ Test \ B \ 003.txt「」C:\ Test \ B_.DAT「 move/b」C:\ Test \ B \ 004.txt「」C :\ Test \ B_DAT「 move/b」C:\ Test \ B \ 005.txt「」C:\ Test \ B_.DAT「 move/b」C:\ Test \ C \ 001.txt「 「C:\測試\ C_.DAT」 按任意鍵繼續。 。 。 – Mickey

+0

您啓用了延遲擴展,但沒有使用它。 '%var%'是即時(正常)擴展。 '!var!'是延遲擴展。 – dbenham

+0

我試過!VAR!它看起來更好,但我沒有得到增加,始終停留在1因此,新的名字總是_001.DAT。 – Mickey

1
@echo off 

:: By Elektro [email protected] 

Setlocal enabledelayedexpansion 

set "OldExt=TXT" 
set "NewExt=DAT" 

FOR /R %%@ in (*%OldExt%) DO (

    REM Sets the directory of the file 
    Set "Directory=%%[email protected]" 

    REM Cuts the directory name to obtain the last folder name 
    Set "Directory=!Directory:~0,-1!" 
    For /L %%X in (0,1,50) DO (Call Set "Directory=!Directory:*\=!") 

    REM Check if this directory is the same of the last accesed directory to reset the counter or not 
    Echo "!Directory!"|FINDSTR "^\"!LastDirectory!\"$" >NUL && (Set /A "Count+=1") || (Set /A "Count=1") 

    REM Check if the number incrementation have 1-3 digits and copies the file 
    Call Echo !COUNT!|FINDSTR "^[0-9]$" >NUL && (Call Copy "%%@" ".\!Directory!_00!COUNT!.%NewExt%") 
    Call Echo !COUNT!|FINDSTR "^[0-9].$" >NUL && (Call Copy "%%@" ".\!Directory!_0!COUNT!.%NewExt%") 
    Call Echo !COUNT!|FINDSTR "^[0-9]..+$" >NUL && (Call Copy "%%@" ".\!Directory!_!COUNT!.%NewExt%" ) 

    REM Sets the last accesed directory 
    Call Set "LastDirectory=!Directory!" 
) 

Pause&exit 

3命名爲 「A」 「B」 和 「C」,每個子目錄的內部3個文件子目錄,輸出結果是:

a_001.DAT 
a_002.DAT 
a_003.DAT 
b_001.DAT 
b_002.DAT 
b_003.DAT 
c_001.DAT 
c_002.DAT 
c_003.DAT 
+0

謝謝!它運行完美,但非常慢。任何想法爲什麼? – Mickey

+0

ofcourse,因爲有一個循環運行50次,將絕對文件夾名稱拆分爲當前文件夾名稱,這不能在批處理中完成,也沒有用於通過字符拆分var的本地方法。並且需要在代碼中使用三重比較來獲得所需的計數增量,因爲在批處理中,您無法執行此操作:「000」+「001」= 001,而且這種比較需要很長的執行時間。 – ElektroStudios

0

這裏針對誰願意做同樣的事情,工作的腳本:

@echo off 

set HomeFolder=%CD% 
set OldExt=TXT 
set NewExt=DAT 
set i=1 
set Folder= 
set LastFolder= 

setlocal ENABLEDELAYEDEXPANSION 

for /f "delims=" %%a in ('dir *.%OldExt% /b /s') do (
    for /f "delims=" %%b in ("%%~dpa\.") do (
     set Folder=%%~nxb   
     if NOT !Folder!==!LastFolder! (set /A i=1) 
     set LastFolder=!Folder! 
     set pad=00!i! 
     set str=!pad:~-3! 
     copy /b "%%a" "%HomeFolder%\%%~nxb_!str!.%NewExt%" 
     Set /A i+=1 
    ) 
) 

endlocal