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: Sat Feb 16, 2013 22:39    Post subject: Reply with quote

Iori
Code:
'•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
' Cоздать указанное число копий для каждого выбранного элемента
' с добавлением счётчика в скобках, начиная с последнего номера
' Параметры: %WL "<путь назначения>" <число копий>
' Пример: %WL "%P" 5

' Автор - Flasher ©
'•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
With WScript.Arguments
  If .Count = 0 Then WScript.Quit
  If .Count <> 3 Then MsgBox "Должно быть указано три параметра!", 48 : WScript.Quit : End If
  List = .Item(0) : Path = .Item(1) : Count = .Item(2)
End With : If Right(Path, 1) <> "\" Then Path = Path & "\"

Set FSO = CreateObject("Scripting.FileSystemObject")
Set Folder = FSO.GetFolder(Path)
Set SFolds = Folder.SubFolders : Set SFiles = Folder.Files
For Each F in Split(FSO.GetFile(List).OpenAsTextStream(1, -1).ReadAll, vbNewLine)
  If F <> "" Then
    If FSO.FolderExists(F) Then Test = 1 Else Test = 0
    If Test Then Set SF = SFolds Else Set SF = SFiles
    TestF F, Ext, Ent, BN
    If Ent And Right(BN, 1) = ")" Then
      M = Mid(BN, Ent + 1, Len(BN) - Ent - 1)
      If IsNumeric(M) Then Max = CLng(M)
      BN = Left(BN, Ent - 2)
    End If
    For Each FF in SF
      TestF FF, Ext1, Ent1, BN1
      If Ext = Ext1 And BN & " (" = Left(BN1, Len(BN) + 2) Then
        If Ent1 And Right(BN1, 1) = ")" Then
          Num = Mid(BN1, Ent1 + 1, Len(BN1) - Ent1 - 1)
          If IsNumeric(Num) Then
            Num = CLng(Num) : If Max < Num Then Max = Num
          End if
        End If
      End If
    Next
    For i = 1 To Count
      If Test Then FSO.GetFolder(F).Copy Path & BN & " (" & Max + i & ")", 0 _
      Else FSO.CopyFile F, Path & BN & " (" & Max + i & ")." & Ext, 0
    Next
  End If : Set SF = Nothing
Next : Set SFiles  = Nothing : Set SFolds = Nothing
Set Folder = Nothing : Set FSO = Nothing : WScript.Quit

Sub TestF(Fl, Ex, E, B)
  If FSO.FolderExists(Fl) Then
    B = FSO.GetFileName(Fl)
  Else
    B = FSO.GetBaseName(Fl) : Ex = LCase(FSO.GetExtensionName(Fl))
  End If : E = InStrRev(B, "(")
End Sub
Вместо сортировки по старинке - максимум.
Понимает имена с юникодными символами.
Выбраны могут быть в т.ч. элементы <имя ()>, будут создаваться <имя (+1)>.
В случае, если получатель отличается от источника, и в нём нет копий со счётчиком, отчёт будет идти от № текущего элемента.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group