如何写一个BAT批处理将子文件夹里的文件分别重命名

一个A文件夹里面有B和C等若干个子文件夹,子文件夹里有多个不同类型的图片文件,如JPG,BMP,PNG等,如何写一个批处理,达到以下三个要求
(1)将B和C文件夹里面的文件按原文件名称的排列顺序按 001,002,003....的顺序重新命名
(2)但B和C文件夹的文件不能连续重命名下去,如B文件夹的最后一个文件是023.jpg,则C文件的第一个文件不能顺序命名为024.PNG,必须又自动从1开始重新命名为001.PNG
(3)批处理文件放在A文件夹内则可执行操作

第1个回答  2014-01-21
@echo off
for /f "delims=" %%i in ('dir/b/s c\*.*') do (
set str=%%~dpi&set str2=%%~nxi
setlocal enabledelayedexpansion
if not "!str!"=="!num!" (
set "n=1"
ren "!str!*.*" "*.*.*"

) else set /a n+=1
ren "!str!!str2!.*" "00!n!.*"
for %%a in (!n!) do endlocal&set n=%%a
set "num=%%~dpi"
)
for /f "delims=" %%i in ('dir/b/s b\*.*') do (
set str=%%~dpi&set str2=%%~nxi
setlocal enabledelayedexpansion
if not "!str!"=="!num!" (
set "n=1"
ren "!str!*.*" "*.*.*"

) else set /a n+=1
ren "!str!!str2!.*" "00!n!.*"
for %%a in (!n!) do endlocal&set n=%%a
set "num=%%~dpi"
)
exit

此代码win7下测试成功

希望能帮助到你 望采纳

第2个回答  2014-01-19
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in ('dir /ad /b') do (
   set num=1000
   for /f "delims=" %%b in ('dir /a-d /b /s "%%a\"') do (
      set /a num+=1
      set num=!num:~1!
      ren "%%b" "!num!%%~xb"
      )
   )
)
pause

追问

显示命令语法不正确

追答@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in ('dir /ad /b') do (
   set num=1000
   for /f "delims=" %%b in ('dir /a-d /b /s "%%a\"') do (
      set /a num+=1
      set sum=!num:~1!
      ren "%%b" "!sum!%%~xb"
   )
)
pause

第3个回答  2014-01-19
@echo off&setlocal enabledelayedexpansion
for /d %%a in (*.*) do (
pushd %%a
set n=1000
for /f "delims=" %%B in ('dir /a-d /b /on^|findstr /i "jpg$ bmp$ png$"') do (
set /a n+=1
set m=!n:~1!
ren "%%B" "!m!%%~xB"
)
popd
)

保存为bat放在A文件夹执行

追问

显示命令语法不正确

追答

你是否是直接复制上面的代码(不要复制前面的行号)
已经测试过,语法是正确的,如果要包含子文件夹的子文件夹,则将for /d 改为for /r /d
@echo off&setlocal enabledelayedexpansion
for /r /d %%a in (*.*) do (
pushd %%a
set n=1000
for /f "delims=" %%B in ('dir /a-d /b /on^|findstr /i "jpg$ bmp$ png$"') do (
set /a n+=1
set m=!n:~1!
ren "%%B" "!m!%%~xB"
)
popd
)

追问

试了一下,如果文件名比较长而且带有中文或符号的,有些能成功命名,有些不能,不知道为什么
还有如果不限定文件类型的话如何修改呢

追答@echo off&setlocal enabledelayedexpansion
for  /r /d %%a in (*.*) do (
pushd "%%a"
set n=1000
for /f "delims=" %%B in ('dir /a-d /b /on') do (
set /a n+=1
set m=!n:~1!
ren "%%~fsB" "!m!%%~xB"
)
popd
)

任何文件都按规则重命名,代码不包括每行前的数字(行号)

重命名时文件名使用短名,希望这样能解决长文件名重命名问题

本回答被提问者采纳
相似回答