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