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

时间:2016-02-10 23:08:07

标签: batch-file random file-rename

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

我有一个包含多个子文件夹的文件夹,在每个子文件夹中都有一些文件命名为: 文件夹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中执行此操作吗?

2 个答案:

答案 0 :(得分:1)

@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命令仅为ECHO在您确认命令正确后,将ECHO(REN更改为REN以实际重命名文件。

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

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

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

构建指令并echo

答案 1 :(得分:1)

编辑:我稍微修改了相应的注释代码:

@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 ..
)