재귀 적 이름 변경 파일 이름 + 배치 파일로 폴더 이름
-
23-08-2019 - |
문제
나는 선택 폴더와 하위 폴더를 재귀 적으로 사용하여 다음 규칙을 가진 파일+폴더를 이름 바꾸는 배치 파일 (Winxp CMD)을 만들고 싶습니다.
모든 파일 + 폴더 이름에서 모든 대문자 + 소문자 "V"및 "W"문자를 문자 "y"및 "z"로 바꿔야합니다.
예 : 11V0W는 11Y0Z가되어야합니다.
나는 그것이 /r에 가능하다고 생각하지만 어떻게? 나는 /r의 기본 재귀 외에 각 문자를 하나씩 점검하는 서브 루틴이 필요하다고 생각합니다.
해결책
다음 배치는 최소한 파일 이름에 대해이 작업을 수행합니다. 디렉토리는 약간 까다 롭습니다 (적어도 지금까지 비-인 나이트 솔루션을 제시 할 수 없었습니다).
@echo off
setlocal enableextensions
for /r %%f in (*) do call :process "%%f"
endlocal
goto :eof
:process
pushd "%~dp1"
set fn=%~nx1
set fn=%fn:V=Y%
set fn=%fn:W=Z%
ren "%~nx1" "%fn%"
popd
goto :eof
그러나 이론적으로는 이것에 대한 이름을 바꾸는 것이 너무 어렵지 않아야합니다.
다른 팁
Tom, 내가 게시 한 이전 스크립트를 다루고 있습니다. 여기에 모든 파일과 하위 디렉토리를 처리하는 것 중 하나가 있습니다.
recurename.cmd 예배 규칙서
@echo off
setlocal ENABLEDELAYEDEXPANSION
set Replaces="V=Y" "W=Z" "m=A"
set StartDir=%~dp1
call :RenameDirs "%StartDir:~0,-1%"
exit /b 0
:RenameDirs
call :RenameFiles "%~1"
for /f "delims=" %%d in ('dir /ad /b "%~1"2^>nul') do call :RenameDirs "%~1\%%~d"
if "%~1"=="%StartDir:~0,-1%" exit /b 0
set _pos=0
set _dir=%~f1
set _dir_orig=!_dir!
:finddirName
set /a _pos-=1
call set _dir_pos=!!!_dir:~%_pos%,1!!!
if not "%_dir_pos%"=="\" goto finddirName
call set _origines=!!!_dir:~0,%_pos%!!!
set /a _pos+=1
call set _dir=!!!_dir:~%_pos%!!!
for %%r in (%Replaces%) do call set _dir=!!!_dir:%%~r!!!
if /i not "!_dir!"=="!_dir_orig!" echo move "%~1" "%_origines%\!_dir!"
exit /b 0
:RenameFiles
for /f "delims=" %%f in ('dir /a-d /b "%~1"2^>nul') do (
set _file=%%~nf
set _file_orig=!_file!
for %%r in (%Replaces%) do call set _file=!!!_file:%%~r!!!
if /i not "!_file!"=="!_file_orig!" echo ren "%~1\%%f" "%~1\!_file!%%~xf"
)
exit /b 0
___메모____
이것은 비파괴적인 스크립트입니다 에코 파일/디렉토리의 이름을 바꾸려면 올바른 명령에서 (에코 이동 그리고 에코 렌)
set set groplaces = : 이 변수를 변경 해야하는 쌍으로 설정하십시오.
set startDir = : 나는 어떻게 든 논쟁을 지키고 그로부터 길을 가고 싶었다. 파일이 매개 변수로 제공되면 전체 컨테이너 디렉토리 및 하위 디어가 처리됩니다.
"%~ 1"== "%"startDir : ~ 0, -1%"exit /b 0 : 0 : 이 줄은 인수 디렉토리 자체가 처리되는 것을 막기 위해 배치되었습니다. 원한다면이 라인을 제거하십시오.
스크립트가 호출되면 C : temp,이 줄을 제거하면 이름이 변경됩니다 C : teap 결국.
이 디렉토리 트리로 :
.
├── 00v0w
│ ├── 12V0W
│ ├── 12d0w
│ └── 12v0d
├── 11V0W
├── 11d0w
└── 11v0d
이것들 렌즈 명령 :
$ renamer --regex --find '[vV]' --replace 'Y' '**'
$ renamer --regex --find '[wW]' --replace 'Z' '**'
이 출력을 생성합니다.
.
├── 00Y0Z
│ ├── 12Y0Z
│ ├── 12Y0d
│ └── 12d0Z
├── 11Y0Z
├── 11Y0d
└── 11d0Z