Я пытаюсь переименовать все файлы в папке и подпапках, удалив часть «-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 ответ1

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
)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .