Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Переименование файлов по списку (таблице) соответствий 
Author Message
Flasher



PostPosted: Tue Oct 04, 2016 05:06    Post subject: Reply with quote

В общем, вот отредактированный вариант (что там по скорости - не знаю, не сравнивал):
Code:
'••••••••••••••••••••••••••••••••• 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).
Установочный модуль, если переноска не нужна.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.


Last edited by Flasher on Wed Oct 05, 2016 01:13; edited 2 times in total
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group