Cambio de nombre de archivo por lotes con alfanumérico aleatorio

Cambio de nombre de archivo por lotes con alfanumérico aleatorio

Estoy buscando cambiar el nombre de un montón de imágenes (todas con extensión .jpg) con nombres alfanuméricos aleatorios. El ejemplo sería 08kDRH1s.jpgo 0FwzUc3.jpg. Al buscar un poco, encontré algunos scripts por lotes que se usaban, $RANDOMpero solo valores entre 0 y 32767.

Un usuario me señaló un script por lotes que genera cadenas alfanuméricas aleatorias de 8 caracteres. ¿Sería difícil modificar esto para cambiar el nombre de los archivos en lugar de simplemente enviar los nombres a la línea de comando?

@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!

Respuesta1

El siguiente script simple cambiará el nombre de todos los archivos .jpg en la carpeta actual a nombres alfanuméricos aleatorios de 8 caracteres, conservando la extensión .jpg. Tenga en cuenta que es posible que el generador de nombres aleatorios produzca un nombre que ya existe, por lo que el script se repite hasta que genera con éxito un nombre único.

@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

Un poco más de código produce una utilidad versátil que le permite especificar la ruta de origen y la máscara del archivo, y también brinda la opción de procesar subdirectorios. La utilidad siempre conserva la extensión de cada archivo. ¡Cuidado con esta utilidad!

cambiar el nombre de 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!"

A continuación se muestran algunos usos de muestra.

Cambie el nombre de todos los archivos en el directorio actual:

renameFilesRandom

Cambie el nombre de todos los archivos .jpg en el directorio actual:

renameFilesRandom *.jpg

Cambie el nombre de todos los archivos .jpg en la carpeta c:\test y todas sus subcarpetas (recursivo):

renameFilesRandom c:\test\*.jpg /s

Respuesta2

@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

información relacionada