일괄. 폴더 및 모든 하위 폴더의 파일 이름을 대량으로 변경

일괄. 폴더 및 모든 하위 폴더의 파일 이름을 대량으로 변경

win7에서 배치 스크립팅을 사용하여 각 파일 이름에서 "-min" 부분을 제거하여 폴더 및 하위 폴더의 모든 파일 이름을 바꾸려고 합니다.

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
CD F:\Mega.Pack-128x128\textures\
FOR /R %%A in (.*)-min.png DO REN "%%A-min.png" "%%A.png"

여기 SET 매개변수에 문제가 있는 것 같아서 다음과 같이 하려고 합니다.

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
CD F:\Mega.Pack-128x128\textures\
For /R %%G in (*-min.png) DO (
    SET "oldname=%%G"
    SET "newname=!oldname:~0,-8!.png"
    REN "!oldname!" "!newname!"
)

하지만 내가 얻는 것은 오류뿐입니다. 루프의 마지막 명령을 에코하면 적절한 경로가 제공됩니다. 내가 무엇을 놓치고 있나요?

답변1

파일 이름을 바꿀 때 대상 이름에 폴더 경로를 포함할 수 없습니다. %%~nxG경로 없이 파일 이름과 확장자를 가져오는 데 사용할 수 있습니다 . oldname 변수는 필요하지 않습니다 %%G. 간단히 . REN 문에서 줄을 제거하고 문자열 조작을 직접 수행할 수 있습니다.

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
CD F:\Mega.Pack-128x128\textures\
For /R %%G in (*-min.png) DO (
    SET "newname=%%~nxG"
    REN "%%G" "!newname:~0,-8!.png"
)

지연된 확장 전에 FOR 변수 확장이 발생하므로 파일 경로의 일부에 !문자가 포함되어 있으면 위의 작업이 실패하므로 값이 손상됩니다. !FOR 변수가 확장될 때 지연된 확장이 비활성화되어 있는지 확인하여 모든 것을 보존할 수 있습니다. 이를 위해서는 루프 내에서 지연된 확장을 켜고 끄는 토글이 필요합니다.

@echo off
setlocal disableDelayedExpansion
cd F:\Mega.Pack-128x128\textures\
for /r %%G in (*-min.png) do (
  set "oldpath=%%G"
  set "newname=%%~nxG"
  setlocal enableDelayedExpansion
  ren "!oldpath!" "!newname:~0,-8!.png"
  endlocal
)

관련 정보