'••••••••••••••••••••••••••••••••• 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 |