Я хочу переименовать несколько изображений (все с расширением .jpg) случайными буквенно-цифровыми именами. Например, 08kDRH1s.jpg
или 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!
решение1
Следующий простой скрипт переименует все файлы .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
Немного больше кода дает универсальную утилиту, которая позволяет указать исходный путь и маску файла, а также предоставляет возможность обрабатывать подкаталоги. Утилита всегда сохраняет расширение каждого файла. Будьте осторожны с этой утилитой!
переименовать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!"
Ниже приведены некоторые примеры использования.
Переименовать все файлы в текущем каталоге:
renameFilesRandom
Переименуйте все файлы .jpg в текущем каталоге:
renameFilesRandom *.jpg
Переименуйте все файлы .jpg в папке c:\test и всех ее подпапках (рекурсивно):
renameFilesRandom c:\test\*.jpg /s
решение2
@echo off
REM The length of the random file name.
Set _RNDLength=8
REM Alphanumeric characters from which to choose.
Set _Alphanumeric=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
SET _Str=%_Alphanumeric%987654321
REM Define the folder to be searched. This value will be used later
REM to build the full path to the file. This is necessary because we
REM are not using /S with the dir command.
SET folder=C:\Users\patrick.seymour\Pictures
REM Loop through all of the JPEGs in the specified folder.
for /f "tokens=*" %%a in ('dir /b "%folder%\*.jpg"') do (
SET RESULT=
SETLOCAL ENABLEDELAYEDEXPANSION
CALL :GetRandomName
echo Renaming "%folder%\%%a" to "!RESULT!.jpg"
ren "%folder%\%%a" "!RESULT!.jpg"
ENDLOCAL
)
GOTO :EOF
:GetRandomName
SET /A _Len=0
:_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
REM Echo Random string is !_RndAlphaNum!
SET RESULT=!_RndAlphaNum!
GOTO :EOF
REM EXIT /B
:EOF