批处理文件 - 循环目录并按字母顺序重命名

时间:2016-01-19 00:58:41

标签: batch-file

我正在尝试编写一个批处理脚本来查找所有目录和子目录,并将它们重命名为字母表中的单个字母

这是我到目前为止所拥有的

@echo off
SET "alfa=0abcdefghijklmnopqrstuvwxyz"
SET count=1
FOR /D /r %%G in ("*") DO (call :subroutine "%%G")
GOTO :eof

:subroutine
 echo %count%:%1
::Get the letter from %alfa% at the index %count%
::Rename the directory %1 to the single char letter retrieved in line above
 SET /a count+=1
IF %count%==26 (
 SET /a count=1
)
 GOTO :eof

将文件夹重命名为什么并不重要,只要它是a)只有一个字母而b)该目录中不存在同名目录

注意:目录中的目录不应超过26个

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

下面的解决方案假设目录名只有一个char,char就是一个字母。如果不是这样,则必须插入其他代码。

@echo off
setlocal EnableDelayedExpansion
call :treeProcess
goto :EOF


:treeProcess
set "alfa=0abcdefghijklmnopqrstuvwxyz"

rem Create "name" array with directory names
set "count=0"
for /D %%d in (*) do (
   set "dir=%%d"
   rem If dir name have more than one letter
   if "!dir:~1!" neq "" (
      rem ... insert it in "name" array
      set /A count+=1
      set "name[!count!]=%%d"
   ) else (
      rem ... remove such letter from the alfa string
      set "alfa=!alfa:%%d=!"
   )
)

rem Rename the directories from "name" array to just one letter from alfa string
for /L %%i in (1,1,%count%) do (
   ren "!name[%%i]!" "!alfa:~%%i,1!"
   set "name[%%i]="
)

rem Recursively call this subroutine to process nested directories
for /D %%d in (*) do (
    cd %%d
    call :treeProcess
    cd ..
)
exit /b

答案 1 :(得分:0)

@ECHO OFF
SETLOCAL 
SET "targetdir=U:\sourcedir"
SET "alphas=a b c d e f g h i j k l m n o p q r s t u v w x y z"
:: prefix each dirname in the subtree with "#" to avoid name-clashes.
FOR /f "delims=" %%t IN ('dir /s /b /ad "%targetdir%" ^|sort /r') DO REN "%%t" "#%%~nxt"
:: Repeat scan and rename
FOR /f "delims=" %%t IN ('dir /s /b /ad "%targetdir%" ^|sort /r') DO (
 SET "renamed="
 FOR %%r IN (%alphas%) DO IF NOT defined renamed IF NOT EXIST "%%~dpt%%r" REN "%%t" "%%r"&SET "renamed=%%r"
)

GOTO :EOF

您需要更改targetdir的设置以适合您的具体情况。

首先,将子树b中的每个目录重命名为其名称前面的一些字符串,该字符串与任何子目录名或文件名的开头不匹配。这可以变得聪明,但我只是使用了#

通过{{1}以反向顺序排列名称,任何子目录名都出现在其父级之前,因此我们将不会尝试重命名其父级已更改名称的子目录。

然后,使用相同的原则,尝试根据需要将子目录的名称更改为单个字母,方法是检查该级别是否已存在有问题字符的子目录。

我建议再次使用一个虚拟子树来衡量它的适用性。