Переименование файлов по списку (таблице) соответствий

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

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

Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

В общем, вот отредактированный вариант (что там по скорости - не знаю, не сравнивал):

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

'••••••••••••••••••••••••••••••••• VBS •••••••••••••••••••••••••••••••••
' Переименовать файлы активной панели по текстовому списку соответствий,
' где между старым и новым именем стоит один запрещённый в именах символ
'
' Условия: 1) путь запуска пользоват. команды/кнопки должен быть пустым
'          2) список соответствий должен быть сохранён в кодировке UTF-8
'          3) требуется ActiveX-компонент LogParser.dll
'
' Параметры: "<Путь к файлу-списку>" <обработка структуры (нет/да): 0/1>
'•••••••••••••••••••••••••••••••••••••••••••••••••• Автор: Flasher © •••

Option Explicit : Dim A, FSO, WSH, FL, DB, Colum, Delim, LQ, InFmt, i
Const Title = " Переименование файлов по базе соответствий"
Set A = WScript.Arguments : If A.Count < 2 Then _
MsgBox Space(15) & "Укажите 2 параметра!", 48, Title : WScript.Quit
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSH = CreateObject("WScript.Shell")
DB = WSH.ExpandEnvironmentStrings(A(0))
If Not FSO.FileExists(DB) Then MsgBox "Файл-список отсутствует" &_
" по заданному пути:" & vbCr & A(0), 48, Title : WScript.Quit
FL = FSO.OpenTextFile(DB).ReadLine
With New Regexp
  .Pattern = "(.*)([""/*\\\t:|<>?])"
  If .Test(FL) Then
    Colum = .Execute(FL)(0).SubMatches(0)
    Delim = .Execute(FL)(0).SubMatches(1)
    If Delim = vbTab Then Delim = "tab"
  Else  MsgBox "На первой строке списка отсутствует " & _
  "запрещённый символ!", 48, Title : WScript.Quit :End If
End With : Set LQ = CreateObject("MSUtil.LogQuery")
Set InFmt = CreateObject("MSUtil.LogQuery.TSVInputFormat")
With InFmt .iCodepage = 65001 : .headerRow = True
 .iHeaderFile = DB : .iSeparator = Delim End With
FFolder FSO.GetFolder(FSO.GetAbsolutePathName(""))
If i <> "" Then _
WSH.Popup Space(29) & "Файлы переименованы!", 2, Title Else _
WSH.Popup Space(22) & "Файлы не соответствуют списку!", 2, Title

Sub FFolder(Folder)
  Dim F, N, BN, Ext, P
  For Each F in Folder.Files
    With LQ.Execute("SELECT * FROM '" & DB &_
    "' WHERE " & Colum & "='" & F.Name & "'", InFmt)
    	N = "" : If Not .atEnd Then N = Trim(.getRecord.getValue(3)) : .close
    End With
    If N <> "" Then
      BN = FSO.GetBaseName(N) : Ext = FSO.GetExtensionName(N)
      i = 0 : P = Folder & "\" : If Ext <> "" Then Ext = "." & Ext
      While FSO.FileExists(P & N) Or FSO.FolderExists(P & N)
        i = i + 1 : N = BN & " (" & i & ")" & Ext
      Wend : F.Name = N
    End If
  Next : If A(1) = 1 Then _
  For Each F in Folder.SubFolders : FFolder F : Next
End Sub
Logparser.dll с манифестами. Файлы кинуть в одну папку с wscript.exe (можно с его симлинком). Подробнее (достаточно п. 1, 2, 7).
Установочный модуль, если переноска не нужна.
Последний раз редактировалось Flasher Ср окт 05, 2016 00:13, всего редактировалось 2 раза.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
myscience
Сообщения: 21
Зарегистрирован: Вт мар 22, 2016 12:51

Сообщение myscience »

http://forum.wincmd.ru/viewpost.php?p=118933

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

Сценарий:	D:\2\2.vbs
Строка:	30
Символ:	12
Ошибка:	Невозможно создание объекта контейнером ActiveX: 'MSUtil.LogQuery'
Код:	800A01AD
Источник: 	Ошибка выполнения Microsoft VBScript
Уточните, пожалуйста, пункт 7, не понял, где это указывать.
Параметры кнопки указал так

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

"D:\1.csv" 1
, пробовал разные варианты.
Файлы распаковал в папку D:\2 туда же положил скрипт и скопировал wscript.exe
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

myscience писал(а):не понял, где это указывать
Что "это"?
Про Код кнопки можно почитать, если кликнуть на нём.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
myscience
Сообщения: 21
Зарегистрирован: Вт мар 22, 2016 12:51

Сообщение myscience »

Change- Parameters я заполнил, но не знаю, где нужно указывать " путь к скопированному ранее интерпретатору." что имеется ввиду?
Где кликнуть?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

В коде кнопки всё очевидно. Где путь к wscript.exe (интерпретатор), где к скрипту. Разве нет?
Кликать нужно по фиолетовому тексту со словами "Код кнопки" над самим кодом. Ваш КО.

К тому же замечу, что использование для предлагаемого инструмента одной из корневых папок диска вместо соответсвующих подпапок ТС (скрипты к скриптам, компоненты к компонентам) с указанием переменных среды, как это полагается, выглядит пренебрежительным, особенно в отношении подфорума, где обсуждение сопутствующих инструментов ведётся именно в рамках Total Commander. Зачем тогда вообще заморачиваться, если для стационарного случая приводился установочный модуль?

Одну ошибку в коде допустил при отладке. Исправил.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
myscience
Сообщения: 21
Зарегистрирован: Вт мар 22, 2016 12:51

Сообщение myscience »

Прошу извинить меня за случившуюся неэтичность. Я только начинаю вникать в устройство скриптов. После инсталлятора исправленный скрипт заработал.
Про код кнопки оставим, видимо у меня древняя версия 5.51 да и не нужно уже после инсталлятора, как я понял.

Можно ли Вас попросить еще несколько модифицировать скрипт. Хотя бы чтобы он мог переименовывать исходные файлы без расширения. Это сложно сделать?
В таблице соответствия хеш файла и через разделитель его имя без расширения.

Исходным именем файла является его хеш, без расширения. По таблице соответствия файл переименовывается.

Было бы совсем хорошо, если бы для файла с произвольным именем рассчитывался мд5 хеш, сравнивался с таблицей соответствия, и в случае их совпадения, файл бы переименовывался.
Но я не знаю, насколько сложно такое написать. Решаю задачу в два этапа: 1) Плагином переименовываю файл в его md5
2) Ваш скрипт (надеюсь, он сможет работать с файлами без расширения)
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Версия 5.51 - это версия чего? :shock:
Код кнопки банален. В поле "Команда:" "путь к wscript.exe" "путь к скрипту.vbs". Чего там непонятно-то? Делается это прежде всего для переменных окружения, в ином случае путь к скрипту можно было бы и первым параметром ставить.

Файлы без расширений скрипт и так переименовывает. Не вижу проблемы.

Вообще очень непредусмотрительно писать о конечной задаче тогда, когда уже работа проделана. Переименование по хэш - это старая песня (как и создание хэш-файлов). И в том случае совсем не требуется файлы ещё и в контрольные суммы переименовывать.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
myscience
Сообщения: 21
Зарегистрирован: Вт мар 22, 2016 12:51

Сообщение myscience »

Версия ТС :D
На файлах без расширений почему-то не сработал.
Дайте, пожалуйста, ответ в теме про утилиту, хотя памятку читал, не всё понятно.
Последний раз редактировалось myscience Чт окт 06, 2016 14:39, всего редактировалось 2 раза.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

myscience
Никакие вопросы по работе версии TC 5.51 на этом форуме не могут обсуждаться в принципе. Вообще никакие. Антиквариату место в музее. Если это действительно так, обновляйтесь. Без этого продолжение разговора теряет всякий смысл.
Последний раз редактировалось Avada Пт окт 07, 2016 11:46, всего редактировалось 1 раз.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

myscience
Вдобавок хочу отметить, что соответствующие скрипты обсуждаются по месту их размещения.
И, судя по вопросам, вижу, что с памяткой подфорума, обязательной к прочтению, ознакомления таки не было. А начать стоило бы с этого.

+ Пропуск заглавных букв и отсутствие точек в конце предложений у нас не поощряется. Пишите аккуратней.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
kabatov
Сообщения: 12
Зарегистрирован: Сб янв 19, 2019 14:56

Сообщение kabatov »

Уважаемый Flasher.

Вас не затруднит ненадолго вернуться к данному скрипту переименования по списку? Я стал использовать его в работе, но в его поведении обнаружилась странность, даже две:
– первый в списке файл всегда остается не переименованным,
– при наличии в именах пробелов появляется следующая ошибка:
Строка: 42
Символ: 5
Ошибка: Error parsing query: Syntax Error: <term2>:
'file-01.tif='new' is not a valid operator [Недопустимый или не неподдерживаемый синтаксис запроса SQL.]
Код: 8007064F
Источник: ClLogQueryClass
Переименовывал файлы вида new file-01.tif.
Спасибо.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

kabatov
Прочтите внимательно памятку подфорума.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Flasher писал(а):Для UTF-8 без LogParser.dll, увы, не обойтись.
Позже выяснилось, что я ошибался. Исправил первый код под UTF-8. Во втором заменил ошибочно указанную точку с запятой на вертикальную черту.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Ответить