'==============================================================
' Переименование файлов\папок в файле-списке по заданной маске.
' Возможные элементы маски (с учётом регистра):
' NNN - имя файла\папки;
' EEE - расширение - только для файлов;
' YYYY - год - 4 цифры;
' YY - год - 2 последние цифры;
' DD - день - всегда 2 цифры;
' D - день - убирается лидирующий 0;
' MM - месяц - всегда 2 цифры;
' M - месяц - убирается лидирующий 0;
' hh - час - всегда 2 цифры;
' h - час - убирается лидирующий 0;
' mm - минута - всегда 2 цифры;
' m - минута - убирается лидирующий 0;
' ss - секунда - всегда 2 цифры;
' s - секунда - убирается лидирующий 0;
' .. - точка (1 символ) - только для файлов;
' ## - при существовании файла\папки маска возвращает следующий номер в виде [N].
'
' Параметры:
' {файл-список} [{режим} [{маска}]]
'
' Здесь {режим} может принимать значения:
' 0 - используется текущая дата-время (по умолчанию),
' 1 - используется дата-время создания файла\папки,
' 2 - используется дата-время модификации файла\папки,
' 3 - используется дата-время доступа файла\папки.
'
' Параметры "режим" и "маска" являются необязательными -
' будет использовано значение по умолчанию.
'
' Пример параметров при вызове из TC:
' %L 1 "NNN_YYYY-MM-DD`hh-mm-ss..EEE"
'==============================================================
Option Explicit
'====== Изменяемые параметры ==================================
' Маска по умолчанию
Const DefaultMask = "NNN_YYYY-MM-DD`hh-mm-ss##..EEE"
Const DefaultMode = 0
'==============================================================
Dim FSO, List, F, Mask, MaskTime, E, Mode, m
Dim NewName, NewNameN, NewNameP
Set FSO = CreateObject("Scripting.FileSystemObject")
Set E = CreateObject("Scripting.Dictionary")
With WScript
List = .Arguments(0)
If .Arguments.Count > 1 Then
Mode = .Arguments(1)
Else
Mode = DefaultMode
End If
If .Arguments.Count > 2 Then
Mask = .Arguments(2)
Else
Mask = DefaultMask
End If
End With
For Each m In Array("YYYY", "YY", "DD", "D", "MM", "M", "hh", "h", "mm", "m", "ss", "s", "NNN", "EEE", "..")
E.Add m, ""
Next
If Mode = 0 Then SetMaskArray1(Now)
For Each F In Split(FSO.OpenTextFile(List).ReadAll, vbNewLine)
If F <> "" Then
SetMaskArray2(F)
NewName = ReplaceAll(Mask, E)
NewNameN = Replace(NewName, "##", "")
NewNameP = FSO.GetParentFolderName(F) & "\" & NewNameN
If (FSO.FileExists(NewNameP) Or FSO.FolderExists(NewNameP)) And (InStr(NewName, "##") > 0) Then
NewNameN = GetNextName(FSO.GetParentFolderName(F), NewName)
End If
If FSO.FileExists(F) Then
FSO.GetFile(F).Name = NewNameN
ElseIf FSO.FolderExists(F) Then
FSO.GetFolder(F).Name = NewNameN
End If
End If
Next
Set E = Nothing
Set FSO = Nothing
WScript.Quit
Function ReplaceAll(pName, pDic)
Dim lK
ReplaceAll = pName
For Each lK In pDic.Keys
ReplaceAll = Replace(ReplaceAll, lK, pDic(lK), 1, -1, 0)
Next
End Function
Sub SetMaskArray1(pMaskTime)
E("YYYY") = Year(pMaskTime)
E("YY" ) = Right(Year(pMaskTime), 2)
E("DD" ) = Right("0" & Day(pMaskTime), 2)
E("D" ) = Day(pMaskTime)
E("MM" ) = Right("0" & Month(pMaskTime), 2)
E("M" ) = Month(pMaskTime)
E("hh" ) = Right("0" & Hour(pMaskTime), 2)
E("h" ) = Hour(pMaskTime)
E("mm" ) = Right("0" & Minute(pMaskTime), 2)
E("m" ) = Minute(pMaskTime)
E("ss" ) = Right("0" & Second(pMaskTime), 2)
E("s" ) = Second(pMaskTime)
End Sub
Sub SetMaskArray2(pPath)
Dim lMaskTime, lF
If FSO.FileExists(pPath) Then
Set lF = FSO.GetFile(pPath)
E("NNN") = FSO.GetBaseName(pPath)
E("EEE") = FSO.GetExtensionName(pPath)
E("..") = "."
ElseIf FSO.FolderExists(pPath) Then
Set lF = FSO.GetFolder(pPath)
E("NNN") = lF.Name
E("EEE") = ""
E("..") = ""
End If
If Mode > 0 Then
Select Case Mode
Case 1 lMaskTime = lF.DateCreated
Case 2 lMaskTime = lF.DateLastModified
Case 3 lMaskTime = lF.DateLastAccessed
End Select
SetMaskArray1(lMaskTime)
End If
Set lF = Nothing
End Sub
Function GetNextName(pPath, pName)
Dim i, lName
i = 0
Do
i = i + 1
lName = Replace(pName, "##", "[" & CStr(i) & "]")
Loop Until Not (FSO.FileExists(pPath & "\" & lName) Or FSO.FolderExists(pPath & "\" & lName))
GetNextName = lName
End Function
|