Пакетное. Массовое переименование файлов в папке и всех подпапках.

Пакетное. Массовое переименование файлов в папке и всех подпапках.

Я пытаюсь переименовать все файлы в папке и подпапках, удалив часть «-min» из каждого имени файла с помощью пакетного скрипта под win7

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

Связанный контент