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

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем alex_diablo, 31 авг 2015.

  1. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    Доброго времени суток!
    появилась такая задачка:

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

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

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

    456123agents_preview_pack_004_BC1.unity3d

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

    Код (DOS):
    for /f "tokens=*" %%a in ('dir /b PATH\*.*') do ren PATH\%%a Prefix%%a
    Код (DOS):
    set thePATH=C:\test
    for %%I in (*.txt) do ren "%thePATH%\%%~nxI" "%%~nI.dat"
     
    Код (DOS):

    for %%I in ("*.zdt") do (
    for /f "delims=-. tokens=1,2,3" %%A in ('echo %%I') do (
    ren %%I %%A-wp%%B.%%C )
    )
     
    но никак не могу понять, как удалять символы с конца имени файла в данном случае...

    помогите пожалуйста.
     
    Последнее редактирование: 31 авг 2015
  2. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    вобщем, поковырялся и сделал вот так:

    Код (DOS):
    @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
    работает, но как то мне кажется, не совсем корректно сделано...
    может кто поправит?
    еще хотелось бы обрезание имени файла вынести в переменную, чтобы можно было в переменной указывать, сколько символов откуда отрезать, с начала или с конца, или заменять в середине, или...
    но что то у меня не получилось вложить переменную в переменную... туплю с экранированием символов... просьба помочь.
     
  3. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.471
    Симпатии:
    4.303
    alex_diablo, все Вы нормально сделали.
    Двойное раскрытие переменной можно организовать так:
    Код (DOS):

    @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
     
     
    Последнее редактирование: 31 авг 2015
  4. alex_diablo
    Оффлайн

    alex_diablo Пользователь

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

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

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

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

    надеюсь понятно объяснил.
     
  5. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.471
    Симпатии:
    4.303
    А не получится ли так, что среди тех файлов, что нужно переименовать попадется
    456123agents_preview_pack_004
    у которого соответственно урежется часть _004
    ?
     
  6. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7

    а в данной версии кода хотелось бы всю команду
    Код (DOS):
    :~0,33
    поместить в переменную TrimCnt
    чтобы в конечном итоге можно было проводить с ней различные манипуляции в зависимости от потребностей. чтобы в саму строчку переименования не лазить.
     
  7. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.471
    Симпатии:
    4.303
    2. Можно как-то привязаться к кол-ву знаков подчеркивания,
    или может получится, что таких знаков = 3, а строку все равно нужно урезать до 2-ух знаков подчеркивания ?
     
  8. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    нет. т.к. заведомо известно, что в одно время в одной папке находятся файлы, именнованные все по одному шаблону. но в разное время количество разделителей может быть разное, поэтому и нужна возможность задать количество разделителей, чтобы подстраивать скрипт.
     
  9. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    поясню задачу: есть файлы вида: 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

    и т.д.
     
  10. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.471
    Симпатии:
    4.303
    Понял. Горе. Отвык писать батники. Сейчас подумаю, как можно.
     
  11. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    вы хотя бы отвыкли... а я так и не научусь никак... особенно циклы, разбор строк... темный лес...

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

    Код (DOS):
    ::@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
     
  12. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.471
    Симпатии:
    4.303
    Код (DOS):
    @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).
    --- Объединённое сообщение, 31 авг 2015 ---
    :)
     
    Kиpилл нравится это.

Поделиться этой страницей