임의의 영숫자로 배치 파일 이름 바꾸기

임의의 영숫자로 배치 파일 이름 바꾸기

임의의 영숫자 이름을 사용하여 여러 이미지(모두 .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 파일 이름을 .jpg 확장자를 유지하면서 임의의 8자 영숫자 이름으로 바꿉니다. 임의 이름 생성기가 이미 존재하는 이름을 생성할 수 있으므로 스크립트는 고유한 이름을 성공적으로 생성할 때까지 반복됩니다.

@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

코드가 조금 더 있으면 소스 경로와 파일 마스크를 지정할 수 있고 하위 디렉터리를 처리하는 옵션도 제공하는 다용도 유틸리티가 생성됩니다. 유틸리티는 항상 각 파일의 확장자를 유지합니다. 이 유틸리티를 조심하세요!

이름 바꾸기파일Random.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

c:\test 폴더와 모든 하위 폴더에 있는 모든 .jpg 파일의 이름을 바꿉니다(재귀적).

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

관련 정보