• Администрация SafeZone приветствует вас на нашем форуме!
    Если вы больше не желаете видеть рекламу при просмотре тем и сообщений - то достаточно просто зарегистрироваться. Для зарегистрированных пользователей реклама не отображается.

Переименование файлов по шаблону с удалением части символов из имени

alex_diablo

Пользователь
Сообщения
142
Симпатии
9
#1
Доброго времени суток!
появилась такая задачка:

есть папка с большим количеством файлов в ней.
файлы вида:
456123agents_preview_pack_004_BC15F9146A415178B95BE92EB26DD92F-56.unity3d

нужен батник, который бы переименовывал по следующему шаблону:

из имени файла с конца удалял заданное число символов, например 32, в итоге
переименованный файл должен принять вид:

456123agents_preview_pack_004_BC1.unity3d

нашел как переименовывать просто файлы:

CMD/BATCH:
for /f "tokens=*" %%a in ('dir /b PATH\*.*') do ren PATH\%%a Prefix%%a
CMD/BATCH:
set thePATH=C:\test
for %%I in (*.txt) do ren "%thePATH%\%%~nxI" "%%~nI.dat"
CMD/BATCH:
for %%I in ("*.zdt") do (
for /f "delims=-. tokens=1,2,3" %%A in ('echo %%I') do (
ren %%I %%A-wp%%B.%%C )
)
но никак не могу понять, как удалять символы с конца имени файла в данном случае...

помогите пожалуйста.
 
Последнее редактирование:

alex_diablo

Пользователь
Сообщения
142
Симпатии
9
#2
вобщем, поковырялся и сделал вот так:

CMD/BATCH:
@echo off
set ext=unity3d
echo.
echo. Rename files started...
for %%I in (%~dp0*.%ext%) do (
set name1=%%I
set name2=%%~nI
call :rename
)
:rename
ren "%name1%" "%name2:~0,-33%.%ext%"
exit /b
работает, но как то мне кажется, не совсем корректно сделано...
может кто поправит?
еще хотелось бы обрезание имени файла вынести в переменную, чтобы можно было в переменной указывать, сколько символов откуда отрезать, с начала или с конца, или заменять в середине, или...
но что то у меня не получилось вложить переменную в переменную... туплю с экранированием символов... просьба помочь.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,736
Симпатии
5,639
#3
alex_diablo, все Вы нормально сделали.
Двойное раскрытие переменной можно организовать так:
CMD/BATCH:
@echo off
set ext=unity3d
set TrimCnt=33
echo.
echo. Rename files started...
for %%I in (%~dp0*.%ext%) do (
  set "name1=%%I"
  set "name2=%%~nI"
  call :rename
)
goto :eof
:rename
  call ren "%name1%" "%%name2:~0,-%TrimCnt%%%.%ext%"
exit /b
 
Последнее редактирование:

alex_diablo

Пользователь
Сообщения
142
Симпатии
9
#4
а как сделать, чтобы не нужно было высчитывать количество символов? ну вот например, в имени файла есть 4 символа нижнего подчеркивания...
и нужно все символы, которые после последнего знака подчеркивания - убрать, т.е. файл 456123agents_preview_pack_004_BC15F9146A415178B95BE92EB26DD92F-56.unity3d
после переименования должен иметь вид: 456123agents_preview_pack_004.unity3d

пробовал задействовать вот этот вариант:

CMD/BATCH:
for %%I in ("*.zdt") do (
for /f "delims=-. tokens=1,2,3" %%A in ('echo %%I') do (
ren %%I %%A-wp%%B.%%C )
)

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

надеюсь понятно объяснил.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,736
Симпатии
5,639
#5
А не получится ли так, что среди тех файлов, что нужно переименовать попадется
456123agents_preview_pack_004
у которого соответственно урежется часть _004
?
 

alex_diablo

Пользователь
Сообщения
142
Симпатии
9
#6
alex_diablo, все Вы нормально сделали.
Двойное раскрытие переменной можно организовать так:
CMD/BATCH:
@echo off
set ext=unity3d
set TrimCnt=33
echo.
echo. Rename files started...
for %%I in (%~dp0*.%ext%) do (
  set "name1=%%I"
  set "name2=%%~nI"
  call :rename
)
goto :eof
:rename
  call ren "%name1%" "%%name2:~0,-%TrimCnt%%%.%ext%"
exit /b

а в данной версии кода хотелось бы всю команду
CMD/BATCH:
:~0,33
поместить в переменную TrimCnt
чтобы в конечном итоге можно было проводить с ней различные манипуляции в зависимости от потребностей. чтобы в саму строчку переименования не лазить.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,736
Симпатии
5,639
#7
2. Можно как-то привязаться к кол-ву знаков подчеркивания,
или может получится, что таких знаков = 3, а строку все равно нужно урезать до 2-ух знаков подчеркивания ?
 

alex_diablo

Пользователь
Сообщения
142
Симпатии
9
#8
А не получится ли так, что среди тех файлов, что нужно переименовать попадется
456123agents_preview_pack_004
у которого соответственно урежется часть _004
?
нет. т.к. заведомо известно, что в одно время в одной папке находятся файлы, именнованные все по одному шаблону. но в разное время количество разделителей может быть разное, поэтому и нужна возможность задать количество разделителей, чтобы подстраивать скрипт.
 

alex_diablo

Пользователь
Сообщения
142
Симпатии
9
#9
2. Можно как-то привязаться к кол-ву знаков подчеркивания,
или может получится, что таких знаков = 3, а строку все равно нужно урезать до 2-ух знаков подчеркивания ?
поясню задачу: есть файлы вида: agents_preview_pack_002_1171C57D8808635BA4F8AFAEA5149D8D.unity3d
agents_preview_pack_004_1171C57D8808635BA4F8AFAEA5149D8D.unity3d
agents_preview_archive_010_1171C57D8808635BA4F8AFAEA5149D8D.unity3d

и т.д.

вот в них нужно убирать хеш (символы вида 1171C57D8808635BA4F8AFAEA5149D8D)

т.е. после манипуляций переименования все файлы должны принять вид:
agents_preview_pack_002
agents_preview_pack_004
agents_preview_archive_010

и т.д.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,736
Симпатии
5,639
#10
Понял. Горе. Отвык писать батники. Сейчас подумаю, как можно.
 

alex_diablo

Пользователь
Сообщения
142
Симпатии
9
#11
вы хотя бы отвыкли... а я так и не научусь никак... особенно циклы, разбор строк... темный лес...

в первой версии скрипта вынес вычитание символов полностью в переменную...

CMD/BATCH:
::@echo off
set ext=unity3d
set TrimCnt=:~0,-33
echo.
echo. Rename files started...
for %%I in (%~dp0*.%ext%) do (
set name1=%%I
set name2=%%~nI
call :rename
)
goto :eof
:rename
call ren "%name1%" "%%name2%TrimCnt%%%.%ext%"
exit /b
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,736
Симпатии
5,639
#12
CMD/BATCH:
@echo off
SetLocal EnableExtensions

set ext=unity3d

:: После какого по счету знака _ нужно урезать?
set Cnt=4

For /f "delims=" %%a in ('2^>NUL dir /b /a-d "*.%ext%"') do (
  for /f "tokens=%Cnt%* delims=_" %%b in ("%%~na") do (
  if "%%c" neq "" (
  set "name1=%%a"
  set "name2=%%c"
  call :rename
  )
  )
)
goto :eof
:rename
  call ren "%name1%.%ext%" "%%name1:_%name2%=%%.%ext%"
exit /B
Только учтите, что если та, часть фразы, которую мы урезаем попадется еще раз в средине файла, то и там тоже будет урезана (пример: 11_22_55_44_55 -> 11_22_44).
в первой версии скрипта вынес вычитание символов полностью в переменную...
:)
 
Сверху Снизу