我正在尝试编写一个批处理脚本来查找所有目录和子目录,并将它们重命名为字母表中的单个字母
这是我到目前为止所拥有的
@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个
感谢您的帮助
答案 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}以反向顺序排列名称,任何子目录名都出现在其父级之前,因此我们将不会尝试重命名其父级已更改名称的子目录。
然后,使用相同的原则,尝试根据需要将子目录的名称更改为单个字母,方法是检查该级别是否已存在有问题字符的子目录。
我建议再次使用一个虚拟子树来衡量它的适用性。