Переименование с периодическим сбросом счётчика

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Nik, d-view, Моторокер, Avada, CaptainFlint

Brnandman
Сообщения: 12
Зарегистрирован: Вс сен 14, 2008 17:38

Переименование с периодическим сбросом счётчика

Сообщение Brnandman »

Поиском нахожу необходимые файлы лежащие в разных директориях, выделяю, вызываю multi-rename tool. Нужно переименовать этот список файлов с использованием счетчика. Как сделать так, чтобы счетчик сбрасывался при переходе в новую директорию?
например я нашел и хочу переименовать файлы:

Код: Выделить всё

c:\new\photo.jpg
c:\new\photo3.jpg
c:\old\photo.jpg
c:\old\photo3.jpg
если использовать маску "photo[C1+1:2]", то получим

Код: Выделить всё

c:\new\photo01.jpg
c:\new\photo02.jpg
c:\old\photo03.jpg
c:\old\photo04.jpg
а мне нужно

Код: Выделить всё

c:\new\photo01.jpg
c:\new\photo02.jpg
c:\old\photo01.jpg
c:\old\photo02.jpg
Аватара пользователя
D1P
Сообщения: 2987
Зарегистрирован: Пн дек 20, 2004 18:30
Откуда: Тбилиси
Контактная информация:

Сообщение D1P »

Имя каталога в MRT само по себе не учитывается.
Как вариант - можно найти (написать?) плагин, выдающий разные результаты в зависимости от пути файла, и использовать его в MRT. Есть или нет конкретно такой плагин - мне не известно.
Если задача разовая, проще, по-моему, пройтись по каталогам, переименовыввая файлы в каждом отдельно.
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

Сообщение Вахмурка »

Первое, что пришло в голову - нельзя. Но попробуй поиграться с ключом [P] - имя родительской директории. Если твоя задача вообще как-то решается, то никак без [P] не обойтись. Кстати, [G] - имя "дедушкиной" (grandpa) директории. Поиграйся с [P], тем более что результат можно увидеть заранее, без переименования как такового.
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Brnandman
Сообщения: 12
Зарегистрирован: Вс сен 14, 2008 17:38

Сообщение Brnandman »

задача не разовая, плагина тоже такого не нашел
игры с [P] и [G] ни к чему не привели, насквозь нумерует файлы и все тут
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Сделал скрипт для ScriptContentPlugin, который можно использовать в MRT. При этом текущий счетчик и текущая папка хранятся в реестре. Получилось очень медленно и в общем случае криво.

Brnandman
Лучше сделать скрипт, который сам переименовывает выделенные файлы.
Нужна именно маска вида "photo[C1+1:2]"? Т. е. одинаковый префикс для всех файлов, а далее без разделителя двухзначное число?
Опиши более детально требования для переименования.
Нет, я не сплю. Я просто медленно моргаю.
Brnandman
Сообщения: 12
Зарегистрирован: Вс сен 14, 2008 17:38

Сообщение Brnandman »

сейчас переименовываю вручную с маской
[G]-[P]-picture-[C]
где [C] - трехзначное число
в будущем такое переименование и нужно.
Спасибо всем откликнувшимся :-)
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Brnandman

vbs-скрипт:

Код: Выделить всё

'======================================================================
' Переименование выделенных файлов по маске
'   [G]-[P]-{заданное слово}-[C]
'   где [P] - имя родительской папки,
'       [G] - имя папки на 2 уровня вверх ("дедушка"),
'       [С] - отдельный счетчик для каждого [P].
'   При этом расширение файлов не меняется.
'
' Параметры вызова из TC:
' %L
'======================================================================

Option Explicit
'======== Изменяемые параметры ========================================
' Заданное слово для маски переименования
Const GeneralWord = "picture"
' Разделитель в маске
Const Delimiter = "-"
' Разрядность счетчика в маске
Const Precision = 3
'======================================================================

Dim Mess, FSO, FileList, F, P, PF, G, Ext, NewName, NewPath
Dim Errors, Counter

SetMess
Set FSO     = CreateObject("Scripting.FileSystemObject")
Set Errors  = CreateObject("Scripting.Dictionary")
Set Counter = CreateObject("Scripting.Dictionary")
CheckParam
For Each F In Split(FSO.OpenTextFile(FileList, 1, False).ReadAll, vbNewLine)
  F = Trim(F)
  If F <> "" Then
    If FSO.FileExists(F) Then
      Ext = "." & FSO.GetExtensionName(F)
      PF  = FSO.GetParentFolderName(F)
      P   = FSO.GetBaseName(PF)
      G   = FSO.GetBaseName(FSO.GetParentFolderName(PF))
      If Not Counter.Exists(PF) Then
        Counter.Add PF, 1
      Else
        Counter(PF) = Counter(PF) + 1
      End If
      NewName = G & Delimiter & P & Delimiter & GeneralWord & Delimiter & Num(Counter(PF), Precision) & Ext
      NewPath = PF & "\" & NewName
      On Error Resume Next
      FSO.MoveFile F, NewPath
      If Err.Number > 0 Then
        Errors.Add F & "  ->  " & NewName, vbNewLine & Err.Description
      End If
      On Error GoTo 0
    End If
  End If
Next

If Errors.Count > 0 Then
  MessBox JoinErr(Errors), 2
Else
  MessBox Mess(3), 3
End If
Quit

Function Num(pC, pPrecision)
  Num = Right(String(pPrecision, "0") & pC, pPrecision)
End Function

Sub CheckParam
  If WScript.Arguments.Count = 0 Then
    MessBox Mess(1), 1
    Quit
  End If
  FileList  = WScript.Arguments(0)
  If Not FSO.FileExists(FileList) Then
    MessBox Mess(2), 1
    Quit
  End If
End Sub

Sub SetMess
  Set Mess = CreateObject("Scripting.Dictionary")
  Mess.Add 0,  "Переименование по маске"
  Mess.Add 1,  "Не указаны параметры!"
  Mess.Add 2,  "Входной параметр не является файлом!"
  Mess.Add 3,  "Операция завершена."
  Mess.Add 4,  "Операция завершена с ошибками." & vbNewLine
  Mess.Add 5,  "Невозможно выполнить переименование:" & vbNewLine
End Sub

Function JoinErr(pDic)
  Dim lKey
  For Each lKey In pDic
    JoinErr = JoinErr & vbNewLine & vbNewLine & Mess(5) & _
              lKey & pDic(lKey)
  Next
  JoinErr = Mess(4) & JoinErr
End Function

Function MessBox(pMess, pMode)
  Dim lIcon
  Select Case pMode
    Case 1 lIcon = vbCritical    + vbOKOnly
    Case 2 lIcon = vbExclamation + vbOKOnly
    Case 3 lIcon = vbInformation + vbOKOnly
  End Select
  MessBox = MsgBox(pMess, lIcon, Mess(0))
End Function

Sub Quit
  Set Counter = Nothing
  Set Errors  = Nothing
  Set FSO     = Nothing
  Wscript.Quit
End Sub
Последний раз редактировалось Batya Сб сен 20, 2008 01:41, всего редактировалось 1 раз.
Нет, я не сплю. Я просто медленно моргаю.
Brnandman
Сообщения: 12
Зарегистрирован: Вс сен 14, 2008 17:38

Сообщение Brnandman »

Batya
переименовывает верно, спасибо
но на каждый файл мне выдает окна:
1)путь к файлу
2)имя P
3)имя G
итого на 10 файлов я получаю 30 окон с сообщениями этими и кнопкой "ok"
может я что-то не так делаю?
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Brnandman
Гы-гы :)
Отладочные строки забыл убрать :?

Исправил исходный скрипт.
Нет, я не сплю. Я просто медленно моргаю.
Brnandman
Сообщения: 12
Зарегистрирован: Вс сен 14, 2008 17:38

Сообщение Brnandman »

Batya
Спасибо!
Существенно проще, чем ручками :-)
slideray
Сообщения: 115
Зарегистрирован: Пн июн 28, 2010 09:34

Счетчик с предельным значением

Сообщение slideray »

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

например:
начать счет с 4-ёх, досчитать до 15-ти, снова начать считать с 4-ёх...
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

slideray
В стандартном инструменте TC — нет.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Тема объединена с имеющейся. Материал целевой темы, не имевший отношения с счётчику, вынесен в отдельную тему Переименование HTML по заданному фрагменту текста. Соответственно, текущей теме дан другой заголовок.
Даже самая богатая фантазия
Не представит себе наши безобразия.
BeardFury78
Сообщения: 213
Зарегистрирован: Чт авг 25, 2016 05:24

Нумерация файлов со сбросом при переходе на следующую папку

Сообщение BeardFury78 »

Здравствуйте, может этот вопрос уже не один раз задавали на форуме, но я лично не нашел... Так вот, суть темы в том, что необходимо произвести нумерацию файлов в подпапках, в данном случае оно должно быть в виде 0001имяфайла.расширение-0999имяфайла.расширение, сами же папки вмещают у себя только 999 файлов, при переходе на следующие папки счетчик нумерации должен сбрасываться до 0001. Но я не нашел способов как это добиться средством Тотала. Возможно то, что сами папки вмещают у себя только фиксированное кол-ство файлов (999 ед.), этому как-то поможет? Может быть нужна какая-то регулярка в ИГП? Например, регулярка именует по счетчику первые 999 выделенных файлов в результате панели поиска, а затем сбрасывает нумерацию при обработке 1000-1998 файлов и так далее... Прошу очень помощи у тех, кто разбирается в Тотале!
Ответить