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
Batya



PostPosted: Wed Aug 19, 2009 17:03    Post subject: Reply with quote

RyzhkovVA
Code:
'=============================================================================
' Переименование выделенных в TC файлов по маске "[DDMMYY] [C] [Add].[E]", где
'   [DDMMYY] - текущая дата;
'   [С]      - счетчик - заглавная буква русского алфавита;
'   [Add]    - любая приставка (передается параметром):
'   [E]      - текущее расширение файла.
'
' Параметры:
' {файл-список\папка} {приставка}
'
' Примеры параметров при вызове из TC:
' %L 640
' "%P" "номер 3"
'
' Автор - Batya
'=============================================================================
Option Explicit
'======== Изменяемые параметры ===============================================
Const FolderRename = False 'Переименовывать ли папки (иначе - файлы в папках)
Const LenYear      = 2     'Количество символов года в маске
Const MoreParams   = True  'Считать все параметры после первого приставкой
Const StartCount   = 192   'Номер первого символа счетчика по кодовой таблице
Const NewFoldCount = True  'Новый счетчик в каждой отдельной папке
'=============================================================================
Dim Mess, FSO, WSH, Errors, FF, Add, F, F1, Counter, CounterG
SetMess
Set FSO    = CreateObject("Scripting.FileSystemObject")
Set WSH    = CreateObject("WScript.Shell")
Set Errors = CreateObject("Scripting.Dictionary")
CheckParam

Counter = 0
If FSO.FolderExists(FF) Then
  If Not FolderRename Then
    For Each F In FSO.GetFolder(FF).Files
      RenameFile F.Path, Counter
      Counter = Counter + 1
    Next
  Else
    RenameFolder FF, Counter
  End If
Else
  For Each F In Split(FSO.OpenTextFile(FF).ReadAll, vbNewLine)
    If F <> "" Then
      F = GetPath(F)
      If Not FSO.FileExists(F) And Not FSO.FolderExists(F) Then
        Errors.Add F, Mess(6)
      Else
        If FSO.FolderExists(F) Then
          If Not FolderRename Then
            If NewFoldCount Then
              CounterG = Counter
              Counter  = 0
            End If
            For Each F1 In FSO.GetFolder(F).Files
              RenameFile F1.Path, Counter
              Counter = Counter + 1
            Next
            If NewFoldCount Then Counter = CounterG
          Else
            RenameFolder F, Counter
          End If
        Else
          RenameFile F, Counter
          Counter = Counter + 1
        End If
      End If
    End If
  Next
End If

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

Quit 0

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

Sub CheckParam
  Dim l, lCount
  lCount = WScript.Arguments.Count
  If lCount = 0 Then
    MessBox Mess(1), 1
    Quit 0
  End If
  FF = GetPath(WScript.Arguments(0))
  If Not FSO.FileExists(FF) And Not FSO.FolderExists(FF)Then
    MessBox Mess(2), 1
    Quit 0
  End If
  If lCount = 1 Then
    Add = ""
  Else
    If MoreParams Then
      For l = 2 To lCount
        Add = Add & " " & WScript.Arguments(l-1)
      Next
    Else
      Add = " " & WScript.Arguments(1)
    End If
  End If
End Sub

Function GetPath(pPath)
  GetPath = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(pPath))
End Function

Sub RenameFile(pPath, pCounter)
  Dim lNewPath, lCounter, lDate, lDateStr, lExt
  lCounter = Chr(StartCount + pCounter)
  lDate    = Date
  lDateStr = Right("0" & Day(lDate), 2) & Right("0" & Month(lDate), 2) & Right(Year(lDate), LenYear)
  lExt     = FSO.GetExtensionName(pPath)
  lNewPath = FSO.GetParentFolderName(pPath) & "\" & lDateStr & " " & lCounter & Add & "." & lExt
  If FSO.FolderExists(lNewPath) Or FSO.FileExists(lNewPath) Then
    Errors.Add pPath, Mess(3) & " - " & lNewPath
  Else
    On Error Resume Next
    FSO.MoveFile pPath, lNewPath
    If Err.Number <> 0 Then
      Errors.Add pPath, Err.Description
      Err.Clear
    End If
    On Error GoTo 0
  End If
End Sub

Sub RenameFolder(pPath, pCounter)
  Dim lNewPath, lCounter, lDate, lDateStr
  lCounter = Chr(StartCount + pCounter)
  lDate    = Date
  lDateStr = Right("0" & Day(lDate), 2) & Right("0" & Month(lDate), 2) & Right(Year(lDate), LenYear)
  lNewPath = FSO.GetParentFolderName(pPath) & "\" & lDateStr & " " & lCounter & Add
  If FSO.FolderExists(lNewPath) Or FSO.FileExists(lNewPath) Then
    Errors.Add pPath, Mess(3) & " - " & lNewPath
  Else
    On Error Resume Next
    FSO.MoveFolder pPath, lNewPath
    If Err.Number <> 0 Then
      Errors.Add pPath, Err.Description
      Err.Clear
    End If
    On Error GoTo 0
  End If
End Sub

Function JoinErr(pDic)
  Dim lKey
  For Each lKey In pDic
    JoinErr = JoinErr & vbNewLine & lKey & " - " & pDic(lKey)
  Next
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(pQuitCode)
  Set Mess   = Nothing
  Set WSH    = Nothing
  Set FSO    = Nothing
  Set Errors = Nothing
  WScript.Quit pQuitCode
End Sub

Практический совет - дату лучше писать в формате [YYMMDD], а не [DDMMYY]. Так нормально сортируется, и вообще визуально намного проще ориентироваться.
_________________
Нет, я не сплю. Я просто медленно моргаю.
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group