J42*_*144 2 windows batch batch-file batch-rename
我想用随机的字母数字名称重命名一堆图像(全部带有 .jpg 扩展名)。示例是08kDRH1s.jpg
or 0FwzUc3.jpg
。做了一些搜索,我确实找到了一些使用的批处理脚本,$RANDOM
但这只是 0 到 32767 之间的值
一位用户向我指出了一个生成随机 8 个字符的字母数字字符串的批处理脚本。仅将名称输出到命令行是否很难调整它以重命名文件?
@Echo Off
Setlocal EnableDelayedExpansion
Set _RNDLength=8
Set _Alphanumeric=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
Set _Str=%_Alphanumeric%987654321
:_LenLoop
IF NOT "%_Str:~18%"=="" SET _Str=%_Str:~9%& SET /A _Len+=9& GOTO :_LenLoop
SET _tmp=%_Str:~9,1%
SET /A _Len=_Len+_tmp
Set _count=0
SET _RndAlphaNum=
:_loop
Set /a _count+=1
SET _RND=%Random%
Set /A _RND=_RND%%%_Len%
SET _RndAlphaNum=!_RndAlphaNum!!_Alphanumeric:~%_RND%,1!
If !_count! lss %_RNDLength% goto _loop
Echo Random string is !_RndAlphaNum!
Run Code Online (Sandbox Code Playgroud)
以下简单脚本将当前文件夹中的所有 .jpg 文件重命名为随机 8 个字符的字母数字名称,保留 .jpg 扩展名。请注意,随机名称生成器可能会生成一个已经存在的名称,因此脚本会循环运行,直到成功生成唯一名称。
@echo off
setlocal disableDelayedExpansion
set "chars=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
for /f "eol=: delims=" %%F in ('dir /b /a-d *.jpg') do call :renameFile "%%F"
exit /b
:renameFile
setlocal enableDelayedExpansion
:retry
set "name="
for /l %%N in (1 1 8) do (
set /a I=!random!%%36
for %%I in (!I!) do set "name=!name!!chars:~%%I,1!"
)
echo if exist !name!.jpg goto :retry
endlocal & ren %1 %name%.jpg
Run Code Online (Sandbox Code Playgroud)
多一点代码会产生一个多功能实用程序,它允许您指定源路径和文件掩码,还提供处理子目录的选项。该实用程序始终保留每个文件的扩展名。小心使用此实用程序!
重命名FilesRandom.bat
:: renameFilesRandom.bat [filter] [/s]
@echo off
setlocal disableDelayedExpansion
:: Parse and validate arguments
set "option="
set "filter="
if "%~3" neq "" (
>&2 echo ERROR: Too many arguments
exit /b 1
)
if /i "%~1" equ "/S" (set "option=/S") else if "%~1" neq "" set "filter=%~1"
if /i "%~2" equ "/S" (set "option=/S") else if "%~2" neq "" (
if defined filter (
>&2 echo ERROR: Only one filter allowed
exit /b 1
) else set "filter=%~2"
)
if "%filter:~0,1%" equ "/" (
>&2 echo ERROR: Invalid option %filter%
exit /b 1
)
if not defined filter set "filter=*"
:: Convert a directory filter into a file filter with wildcards
if exist "%filter%\" set "filter=%filter%\*"
:: Determine source if /S option not specified
set "src="
if not defined option for /f "eol=: delims=" %%F in ("%filter%") do set "src=%%~dpF"
:: Rename the specified files
set "chars=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
for /f "eol=: delims=" %%F in ('dir /a-d /b %option% "%filter%"') do call :renameFile "%%F"
exit /b
:renameFile
setlocal
if not defined src set "src=%~dp1"
set "old=%~nx1"
set "ext=%~x1"
setlocal enableDelayedExpansion
:retry
set "name="
for /l %%N in (1 1 8) do (
set /a I=!random!%%36
for %%I in (!I!) do set "name=!name!!chars:~%%I,1!"
)
if exist "!src!!name!!ext!" goto :retry
ren "!src!!old!" "!name!!ext!"
Run Code Online (Sandbox Code Playgroud)
下面是一些示例用法。
重命名当前目录中的所有文件:
renameFilesRandom
Run Code Online (Sandbox Code Playgroud)
重命名当前目录中的所有 .jpg 文件:
renameFilesRandom *.jpg
Run Code Online (Sandbox Code Playgroud)
重命名 c:\test 文件夹中的所有 .jpg 文件及其所有子文件夹(递归):
renameFilesRandom c:\test\*.jpg /s
Run Code Online (Sandbox Code Playgroud)