我有 80 个文件夹,每个文件夹内都有 1 到 30 张图像。
我正在寻找一种将每个图像重命名为随机 20 位数字的方法。 这是一个例子:
Folder_1
|
--- J0tNNchs7U.png -> 59106128950679048106.png
--- nB9HodYxov.png -> 95787130775876521419.png
--- 4yZswgC7xh.png -> 86675183902449304154.png
--- Ax9xwx1e4L.png -> 00276988431900233660.png
Folder_2
|
--- a1yoCwGeUE.png -> 82032328129568492832.png
--- xwItDSLNg4.png -> 98505854158768600999.png
--- 5beJ52yhD1.png -> 90915835999997422646.png
Folder_3
|
--- oSWqLBsymz.png -> 42132595053848488418.png
--- AgoS8guAxi.png -> 76836254163466666967.png
Folder_4
|
--- 5xLO5IXwRd.png -> 39762534969789244484.png
Etc...
如果我想手动执行,可能需要 2 到 4 小时,可以在 Windows 10 中使用
cmd
执行此操作吗?
谢谢你。
很有可能。这是生成 20 位随机数的方法:
@echo off
setlocal enabledelayedexpansion
set "res=" & set "rnd="
for /l %%i in (1,1,20) do (
set /a rnd=!random! %% 10
set res=!res!!rnd!
)
echo !res!
然后可以将其与文件重命名合并:
@echo off
pushd "C:\path to png files"
setlocal enabledelayedexpansion
for /R %%i in (*.png) do (
set "name=%%~ni"
if "!name:~19,1!" == "" call :digits "%%i"
)
Popd
goto :EOF
:digits
echo "%~n1" | findstr /VRC:"[a-Z]" && goto :EOF
set "res=" & set "rnd="
for /l %%i in (1,1,20) do (
set /a rnd=!random! %% 10
set "res=!res!!rnd!"
)
if exist "%~dp1!res!%~x1" goto :digits
echo ren "%~1" "!res!%~x1"
goto :EOF
请注意,最后一行的
echo
用于 QA 目的,只有在打印结果看起来正确后才删除 echo
。在生产中运行之前,请务必先在测试文件夹中对其进行测试。
说明: 我运行一个 for 循环来获取每个
png
文件,然后使用文件名调用 :digits
标签。
for
标签中的:digits
循环只是在每个周期生成一个随机数,最大数字为1,因此是%% 9
。然后,它将在 set res=!res!!rnd!
行中将每个数字附加到另一个数字旁边,直到附加所有 20 个数字成为单个变量,然后只需将文件重命名为创建的变量即可。
您可以构建一些检查,以确保您的现有文件中不存在已包含随机数的文件,并且仅重命名还不是 20 位数字的文件,但问题更多的是如何创建随机的 20 位数字数字。
有关所用命令的更多帮助,请打开
cmd
并运行:
for /?
set /?
setlocal /?
这是使用随机 20 位数字在整个目录树中重命名 PNG 文件的另一种解决方案:
@echo off & setlocal EnableExtensions DisableDelayedExpansion
(for /F "delims=" %%I in ('dir "%~dp0*.png" /A-D-L /B /S 2^>nul') do set "FullName=%%I" & set "FilePath=%%~dpI" & call :RenameFile %%~xI) & exit /B
:RenameFile
setlocal EnableDelayedExpansion
:CreateName
set "NewName=" & for /L %%J in (1,1,5) do set "Number=000!RANDOM!" & set "NewName=!NewName!!Number:~-4!"
if not exist "!FilePath!!NewName!%1" (ren "!FullName!" "!NewName!%1" & endlocal & goto :EOF) else goto CreateName
此解决方案会重命名批处理文件目录及其子目录中的所有 PNG 文件,甚至重命名子目录或具有丑陋名称(如
Development & Test(!) 100%
)并带有与号、感叹号、圆括号和百分号的 PNG 文件。 %~dp0
在第二个命令行中引用末尾带有反斜杠的批处理文件路径可以被删除,以重命名当前工作目录及其子目录中的文件,或替换为任何其他以反斜杠结尾的目录路径。
编写批处理文件代码是为了尽可能避免批处理文件打开/查找/读取/关闭操作,通过使用单行多个命令将文件系统和批处理文件访问减少到(几乎)最少。 (可以进一步优化代码,但这会使阅读命令行变得非常困难。)
不会多次重命名 PNG 文件,即使在 FAT32 或 exFAT 格式的驱动器上运行此批处理文件也不会跳过 PNG 文件,因为首先加载到批处理文件处理的内存中
cmd.exe
所有 PNG 文件在开始重命名 FOR 循环之前使用完整路径命名。
dynamic变量RANDOM保存一个0到32767之间的随机十进制数。该解决方案仅使用最后四位数字,这意味着范围为
0000
到9999
的十进制数,并将五个这样的随机数连接在一起形成一个20 位随机数。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
call /?
dir /?
echo /?
endlocal /?
exit /?
for /?
goto /?
if /?
ren /?
set /?
setlocal /?