Ich möchte eine Reihe von Bildern (alle mit der Erweiterung .jpg) mit zufälligen alphanumerischen Namen umbenennen. Ein Beispiel wäre 08kDRH1s.jpg
oder 0FwzUc3.jpg
. Bei der Suche habe ich einige Batch-Skripte gefunden, die dies verwenden, $RANDOM
aber das sind nur Werte zwischen 0 und 32767
Ein Benutzer hat mich auf ein Batch-Skript hingewiesen, das zufällige alphanumerische Zeichenfolgen mit 8 Zeichen generiert. Wäre es schwierig, dies so zu optimieren, dass Dateien umbenannt werden, anstatt die Namen einfach in der Befehlszeile auszugeben?
@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!
Antwort1
Das folgende einfache Skript benennt alle .jpg-Dateien im aktuellen Ordner in zufällige alphanumerische Namen mit 8 Zeichen um, wobei die Erweiterung .jpg erhalten bleibt. Beachten Sie, dass der Zufallsgenerator möglicherweise einen Namen generiert, der bereits existiert. Das Skript wird also wiederholt, bis es erfolgreich einen eindeutigen Namen generiert hat.
@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
Mit etwas mehr Code erhalten Sie ein vielseitiges Dienstprogramm, mit dem Sie den Quellpfad und die Dateimaske angeben können und das auch die Option bietet, Unterverzeichnisse zu verarbeiten. Das Dienstprogramm behält immer die Erweiterung jeder Datei bei. Seien Sie mit diesem Dienstprogramm vorsichtig!
renameFilesRandom.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!"
Nachfolgend finden Sie einige Anwendungsbeispiele.
Alle Dateien im aktuellen Verzeichnis umbenennen:
renameFilesRandom
Benennen Sie alle .jpg-Dateien im aktuellen Verzeichnis um:
renameFilesRandom *.jpg
Benennen Sie alle .jpg-Dateien im Ordner c:\test und allen seinen Unterordnern um (rekursiv):
renameFilesRandom c:\test\*.jpg /s
Antwort2
@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