Renommer le fichier par lot avec alphanumérique aléatoire

Je cherche à renommer un tas d'images (toutes avec extension .jpg) avec des noms alphanumériques aléatoires. L'exemple serait 08kDRH1s.jpg ou 0FwzUc3.jpg . En recherchant, j'ai trouvé quelques scripts par lots qui utilisaient $RANDOM mais ce ne sont que des valeurs comprises entre 0 et 32767

Un utilisateur m'a signalé un script de lot qui génère des chaînes alphanumériques aléatoires de 8 caractères. Est-ce qu'il serait difficile de modifier ce problème pour renommer les fichiers simplement en sortant les noms vers la ligne de commande?

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

Le script simple suivant renommera tous les fichiers .jpg dans le dossier actuel aux noms alphanumériques aléatoires de 8 caractères, en préservant l'extension .jpg. Notez qu'il est possible pour le générateur de nom aléatoire de produire un nom qui existe déjà, de sorte que le script passe en boucle jusqu'à ce qu'il génère avec succès un nom unique.

 @echo off setlocal disableDelayedExpansion set "chars=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" for /f "eol=: delims=" %%F in ('dir /b /ad *.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 code un peu plus produit un utilitaire polyvalent qui vous permet de spécifier le chemin source et le masque de fichier, et fournit également l'option de traiter les sous-répertoires ainsi. L'utilitaire conserve toujours l'extension de chaque fichier. Soyez prudent avec cet utilitaire!

RenommerFilesRandom.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 /ad /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!" 

Voici quelques exemples d'utilisation.

Renommez tous les fichiers dans le répertoire actuel:

 renameFilesRandom 

Renommez tous les fichiers .jpg dans le répertoire actuel:

 renameFilesRandom *.jpg 

Renommez tous les fichiers .jpg dans le dossier c: \ test et tous ses sous-dossiers (récursifs):

 renameFilesRandom c:\test\*.jpg /s 
 @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