2012-11-30 39 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