在子文件夹中使用随机文件名批量重命名文件

Bulk rename files with random filenames in subfolders

好的,所以我想自动将许多文件重命名为随机的字母数字名称,场景如下:

我有一个包含多个子文件夹的文件夹,在每个子文件夹中都有几个文件,其命名方式如下:
文件夹 A

ABCDE.a1.ext  
ABCDE.a2.ext  
ABCDE.a3.ext  
...  

文件夹 B

FGHIJ.a1.ext  
FGHIJ.a2.ext  
FGHIJ.a3.ext  
...  

我想要的是将文件重命名为随机名称,但保留后缀和扩展名,例如:

文件夹 A

HJGKU.a1.ext  
HJGKU.a2.ext  
HJGKU.a3.ext  
... 

文件夹 B

EOBPZ.a1.ext  
EOBPZ.a2.ext  
EOBPZ.a3.ext  
... 

有人知道如何在 Batch 中执行此操作吗?

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "olddir="
FOR /f "tokens=1,2*delims=." %%a IN (
 'dir /s /b /a-d "%sourcedir%\*.*.*" '
 ) DO IF "%%c" neq "" (
 CALL :randomname "%%a"
 CALL ECHO(REN "%%a.%%b.%%c" "%%randname%%.%%b.%%c"

)

GOTO :EOF

:randomname
IF "%olddir%"=="%~1" GOTO :EOF
set "olddir=%~1"
SET "randname="
SETLOCAL enabledelayedexpansion
:randnlp
SET /a $=%RANDOM% %% 36
SET /a $$=0
FOR %%s IN (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 0 1 2 3 4 5 6 7 8 9) DO (
 IF !$$!==%$% SET randname=%randname%%%s
 SET /a $$+=1
)
IF "%randname:~4%"=="" GOTO randnlp
ENDLOCAL &SET "randname=%randname%"

GOTO :eof

您需要更改 sourcedir 的设置以适合您的情况。

所需的 REN 命令仅 ECHOed 用于测试目的。 确认命令正确后,将ECHO(REN更改为REN以实际重命名文件。

执行目录扫描,子目录在 . 上标记化,并通过要求 %%c 非空来确保有 3 个部分。

将基本文件名传递给 randomname 例程,如果发现基本名称发生变化,该例程会生成一个新的随机名称。

我使用了幻数 36(for %%s 字符串中的字符数)和 4(比随机名称中要求的字符数少一个)

构建指令并echo它。

编辑:我根据评论稍微修改了代码:

@echo off
setlocal EnableDelayedExpansion

set "alphaNum=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

rem I got a folder with multiple subfolders,
for /D %%s in (*) do (

   rem in each subfolder
   cd "%%s"

   rem there are a couple of files named in a pattern like: ABCDE.a1.ext
   rem I want the files renamed to random names,
   set "ranName="
   for /L %%i in (1,1,5) do (
      set /A "ranNum=!random! %% 36"
      for %%r in (!ranNum!) do set "ranName=!ranName!!alphaNum:~%%r,1!"
   )

   rem but preserving the suffix and extension, like: HJGKU.a1.ext
   ren "*.*.*" "!ranName!.*.*"

   cd ..
)