Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Переименование папок по маске (http://forum.oszone.net/showthread.php?t=338591)

dassen 07-01-2019 00:15 2850267

Переименование папок по маске
 
Есть папки с именами F-LDR*. Нужно добавить к их именам суффикс __MY, т.е. привести к виду F-LDR*__MY.
И противоположная задача (более важная):
Есть папки с именами F-LDR*__MY. Нужно убрать из их имен суффикс __MY, т.е. привести к виду F-LDR*.
(ReNamer такое делает, в т.ч. и с папками, но хотелось бы то же выполнять из пакетного файла - быстрее и удобнее).
Интересует только CMD/BAT.
Все папки непустые, будут лежать в одном каталоге и на одном уровне с требующимся батником; подпапки не трогать.
(Гуглил, но ничего подобного для папок не нашел... Если возможно, научите. Спасибо!)

YuS_2 07-01-2019 08:07 2850298

С такой постановкой задачи:
Цитата:

Цитата dassen
Интересует только CMD/BAT. »

Вот это вряд ли:
Цитата:

Цитата dassen
Если возможно, научите. Спасибо!) »

Хотя, в принципе, можно примерно так:
Код:

for /f "delims=" %%i in ('dir /b/ad "F-LDR<"') do echo ren "%%~i" "%%~i__MY"
echo - в боевых условиях удалить.
обратное действие, тоже можно накидать подобным способом, через цикл, только имена каталогов придется передавать через промежуточную переменную и затем, заменой удалять ненужные символы, примерно так:
Код:

... do (
    set "var=%%~i"
    echo ren "%%~i" "!var:__MY=!"
)

восклицательный знак тут не случайно, ибо внутри скобок придется использовать отложенное раскрытие... ну или использовать вызов call и стандартное %-раскрытие...

ЗЫ
Но возникает закономерный вопрос: Вам шашечки или ехать?
Лучше изучайте повершелл, в нем многое гораздо проще делать... :)

Iska 07-01-2019 08:48 2850300

Цитата:

Цитата YuS_2
можно примерно так: »

Туда попадают и ранее переименованные каталоги, наподобие:
Цитата:

Код:

C:\Мои проекты\0235\01>dir /b/ad "F-LDR<"
F-LDR001__MY
F-LDR002
F-LDR003__MY
F-LDR004


Колитесь, коллега, откуда брали про «<» в маске, и что он даёт?

YuS_2 07-01-2019 09:29 2850304

Цитата:

Цитата Iska
Туда попадают и ранее переименованные каталоги, наподобие: »

Ну, тут надо выбирать, либо туда, либо сюда... то бишь, сначала удаляем суффиксы, потом все скопом переименовываем, как требуется.
К тому же, в условии не сказано, что там уже присутствуют каталоги с суффиксами... :)

Цитата:

Цитата Iska
Колитесь, коллега, откуда брали про «<» в маске, и что он даёт? »

Дежавю, однако. :)

dassen 07-01-2019 10:29 2850306

YuS_2, спасибо!
Цитата:

Цитата YuS_2
Хотя, в принципе, можно примерно так: »

F-LDR* to F-LDR*__MY работает отлично. :up Но гораздо больше чисто практически интересует что-то подобное именно для F-LDR*__MY to F-LDR*, т.к. можно было бы вставить готовый код в мой "рабочий" батник - поэтому:
Цитата:

Цитата dassen
Интересует только CMD/BAT. »

А что касается:
Цитата:

Цитата YuS_2
Лучше изучайте повершелл »

, то если бы написание более-менее сложных скриптов было бы каждодневной необходимостью (а не от случая к случаю), то так бы и сделал... (наверное, уже на пенсии).
Другими словами, на сегодняшнй день очень интересует:
Цитата:

Цитата dassen
Есть папки с именами F-LDR*__MY. Нужно убрать из их имен суффикс __MY, т.е. привести к виду F-LDR*. »

Вот только:
Цитата:

Цитата YuS_2
тоже можно накидать подобным способом »

- это точно не с моими теперешними навыками... Выручайте... :pray:

Iska 07-01-2019 11:48 2850321

Цитата:

Цитата YuS_2
Дежавю, однако. »

Угу. Ну, ещё раза два-три спрошу, опосля, может быть, запомню :lol:.


dassen, что делать, если есть, например, и каталог F-LDR003, и каталог F-LDR003__MY?

There.cmd
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq delims=" %%i in (
        `2^>nul dir /b /a:d ^| findstr.exe /i /r /c:"^F-LDR.*" ^| findstr.exe /i /v /r /c:".*__MY$"`
) do (
        if not exist "%%~i__MY\." (
                echo Rename folder [%%~i] into [%%~i__MY].
                ren "%%~i" "%%~i__MY"
        ) else (
                echo Can't rename folder [%%~i] into [%%~i__MY] because folder [%%~i__MY] already exists.
        )
)

endlocal
exit /b 0

…and…
Back Again.cmd
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq delims=" %%i in (
        `2^>nul dir /b /a:d ^| findstr.exe /i /r /c:"^F-LDR.*__MY$"`
) do (
        set sFolderName=%%~i
        set sNewFolderName=!sFolderName:~0,-4!

        if not exist "!sNewFolderName!\." (
                echo Rename folder [%%~i] into [!sNewFolderName!].
                ren "%%~i" "!sNewFolderName!"
        ) else (
                echo Can't rename folder [%%~i] into [!sNewFolderName!] because folder [!sNewFolderName!] already exists.
        )
)

endlocal
exit /b 0


dassen 07-01-2019 12:19 2850333

Немного помыслил... :lamer:
В принципе, мне все равно, каким суффиксом изначально было для себя метить папки F-LDR*. Главное - чтобы можно было в нужный момент этот суффикс отбросить.
И если использовать суффикс
Код:

.__MY
вместо
Код:

__MY
, то с задачей F-LDR*.__MY to F-LDR* вполне справится этот код:
Код:

for /f %%i in ('dir /b/ad "F-LDR*.__MY"') do ren "%%i" "%%~ni"
(на идею натолкнул код от YuS_2 :bow: ).
Необычно? Но работает. Может, что-то "по-грамотному" подправить/добавить? ;)
"А можно такое же, но без точки?" :)
P.S.
Отправил это сообщение еще до того, как обнаружил, что уже есть предыдущее от Iska.
Прошу учесть...

dassen 07-01-2019 13:13 2850359

Iska, спасибо! Именно то, что требовалось! :laiel:
Цитата:

Цитата Iska
dassen, что делать, если есть, например, и каталог F-LDR003, и каталог F-LDR003__MY? »

Именно то, что и делает ваш There.cmd:
к F-LDR* добавлять суффикс __MY
к F-LDR*__MY еще один суффикс __MY добавлять не нужно.
P.S.
Если бы прочитал Ваше сообщение до написания своего

Цитата:

Цитата dassen
Немного помыслил... »

, то свое бы уже не писал. :no:

megaloman 07-01-2019 13:18 2850363

Удаление суффикса
Код:

@Echo Off
cls
        Set "Pref=F-LDR"
        Set "Suff=__MY"
        Set "Ext=.*"

        Set "BoxIn=%~dp0"
        If "%BoxIn:~-1%"=="\" Set "BoxIn=%BoxIn:~0,-1%"
 
        FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "%BoxIn%\%Pref%*%Suff%%Ext%" /B /A:D`) DO (
                Call :MyDel "%BoxIn%\%%d" "%Suff%"
        )       
Pause
GoTo :Eof

rem Удаление суффикса
:MyDel
        Set "Name=%~n1:"
        Call Set "Name=%%Name:%~2:=%%"
        If Not "%~n1:%~x1"=="%Name%%~x1" Ren %1 "%Name%%~x1" ||(Echo Ren %1 --^> "%Name%%~x1" already exists &Echo.)
GoTo :Eof

Добавление суффикса
Код:

@Echo Off
cls
        Set "Pref=F-LDR"
        Set "Suff=__MY"
        Set "Ext=.*"

        Set "BoxIn=%~dp0"
        If "%BoxIn:~-1%"=="\" Set "BoxIn=%BoxIn:~0,-1%"

        FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "%BoxIn%\%Pref%*%Ext%" /B /A:D`) DO (
                Call :MyAdd "%BoxIn%\%%d" "%Suff%"
        )       
Pause
GoTo :Eof

rem Добавление суффикса если его еще нет
:MyAdd
        Set "Name=%~n1:"
        Call Set "Name=%%Name:%~2:=%%"
        If "%~n1:%~x1"=="%Name%%~x1" Ren %1 "%~n1%~2%~x1" ||(Echo Ren %1 --^> "%~n1%~2%~x1" already exists &Echo.)
GoTo :Eof

Цитата:

Цитата dassen
.__MY »

Это уже не суффикс, а окончание (или, как принято, расширение), и для него надо спеть другую песТню.
Цитата:

Цитата
Тестировал на наборе (туда-сюда) на папках с расширениями и без
F-LDRkuku__MY
F-LDRkuku__MY.ttt
F-LDRkuku__MY.__MY
F-LDRтра ля ля__MY
F-LDRтра ля ля__MY.kkk
F-LDRтра ля ля__MY.__MY


YuS_2 07-01-2019 13:38 2850371

Цитата:

Цитата dassen
- это точно не с моими теперешними навыками... Выручайте... »

Дык, это же почти готовое решение, т.е. берем этот код:
Код:

for /f "delims=" %%i in ('dir /b/ad "F-LDR<"') do echo ren "%%~i" "%%~i__MY"
и превращаем его в такой:
Код:

@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /b/ad "F-LDR<"') do (
    set "var=%%~i"
    echo ren "%%~i" "!var:__MY=!"
)


dassen 07-01-2019 14:53 2850388

YuS_2, спасибо.
Опробовал. Так убираются из имен все __MY, которые встречаются в любом количестве не только как суффикс, но и в любом месте *-части имени.
Но мне (как вариант) это подходит, т.к. в моем (частном) случае 1 шт. __MY и только как суффикс, т.е. ничего лишнего не удалится.
И компактно!

YuS_2 07-01-2019 15:33 2850396

Цитата:

Цитата dassen
не только как суффикс, но и в любом месте »

Это да, так работает замена в cmd.
Но если надо что-то более точное, то присмотреться необходимо к powershell и регэкспам, с ними всё гораздо проще решается.

megaloman 07-01-2019 16:05 2850405

dassen, Если Вам всё равно, в каком месте убивается __My, если надо чтобы кратко (что мне совсем не нравится, удобнее иметь легко настраиваемый код):
Код:

@Echo Off
rem Удалить
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "F-LDR*__My.*" /B /A:D`) DO Set "N=%%d" &Call Ren "%%d" "%%N:__My=%%"
rem Добавить
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "F-LDR*.*" /B /A:D`) Do Ren "%%d" "%%~nd__My%%~xd"

Если только удалить, красные строки убираем
Если добавить (при этом чтобы суффиксы не дублировались, сначала их удаляем) - оставляем все строки
И, чтобы совсем кратко, убиваем строки с Rem
При использовании
setlocal enabledelayedexpansion
будут проблемы с именами папок, если в именах есть "!"

dassen 07-01-2019 17:24 2850414

megaloman, спасибо.
Цитата:

Цитата megaloman
При использовании
setlocal enabledelayedexpansion
будут проблемы с именами папок, если в именах есть "!" »

Проверил... Проблемы - не то слово:
"!" в имени - и имя папки просто не обрабатывается (мне пока среди моих F-LDR*такие не попадались, но кто знает...)
Цитата:

Цитата megaloman
кратко (что мне совсем не нравится, удобнее иметь легко настраиваемый код) »

Да мне всего лишь нужна раз-навсегда написанная (и лучше единственная) строка для "удалить", которую я добавлю в мой "рабочий" батник. Корректирую свои требования: пусть она сносит все __MY, где бы она их ни нашла (ведь найдет она их только как суффиксы). И, по-моему, Ваш крайний вариант идеален.
А что касается "добавить" - здесь я за краткостью не гонюсь, и вопросы у меня еще будут (не сегодня).

kolob204 13-05-2020 13:40 2920976

А как рекурсивно по всем подкаталогам пройтись таким переименованием?

megaloman 13-05-2020 16:25 2920993

Код:

@Echo Off
        Call :DelSuff "Z:\Box_In\F-LDR*__My.*" "__My"
        Call :AddSuff  "Z:\Box_In\F-LDR*.*" "__My"
Exit /B

:DelSuff
        FOR /F "usebackq delims=" %%d IN (`2^>nul Dir %1 /S /B /A:D ^|Sort /R`) DO (
                Set "N=%%~nd" &Call Ren "%%d" "%%N:__My=%%%%~xd"
        )
Exit /B

:AddSuff
        FOR /F "usebackq delims=" %%d IN (`2^>nul Dir %1 /S /B /A:D ^|Sort /R`) DO (
                Call Ren "%%d" "%%~nd%~2%%~xd"
        )
Exit /B



Время: 10:31.

Время: 10:31.
© OSzone.net 2001-