Копирование с переименовыванием по счетчику

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Dimsok

[cut="Обновка. Не знаю, актуально ли. Но всё-равно кому-то может пригодится."]

Код: Выделить всё

'••••••••••••••••••••••••••••••••••••••••••• VBS ••••••••••••••••••••••••••••••••••••••••••
' Cоздать указанное число копий/пустышек для каждого выбранного элемента
' с добавлением счётчика после базового имени, начиная с последнего номера

' Параметры: %WL "<путь назначения>" <число копий> <вставка до №> <расширение нового файла>
' Если указан 5-й параметр, то создаваться будут пустые элементы
' Ключ для смены начала счётчика с единицы на двойку: /2

' Примеры:   %WL "%P" /2   |   %WL "%T" 3   |   %WL "%P" 5 _v   |   %WL "%T" 1 "" txt
'••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• Автор: Flasher © •••

Option Explicit : Dim C, Two, List, Cn, Path, Count, Px, Ext, ShA, FSO, Rgx
Dim F, FN, Test, Ex, BN, Max, i, n, M, Items, FF, Exist, FP, Cnt, Num, Check

With WSH.Arguments
  C = .UnNamed.Count : Two = .Named.Exists("2") : If C = 0 Then WSH.Quit
  If C = 1 Then MsgBox "Должно быть указано не менее 2-х параметров!", 48 : WSH.Quit
  List = .Item(0) : Path = .Item(1) : If C > 2 Then Count = .Item(2)
  If Count = "" Then Count = Trim(InputBox(String(4, vbLf) & "Введите число создаваемых копий"&_
  vbLf & "для каждого выбранного элемента:", Space(13) & "Создание копий выбранных элементов"))
  If Not IsNumeric(Count) Then WSH.Quit : End If : If C > 3 Then Px = .Item(3)
  If C = 5 Then If .Item(4) <> "" Then Ext = "." & .Item(4) End If
End With : Set Rgx = New RegExp : Rgx.Pattern = "^(.*\D)?((0*)\d+)$"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set ShA = CreateObject("Shell.Application")
Set List = FSO.OpenTextFile(List,,,-1)

Do : F = Trim(List.ReadLine)
  FN = FSO.GetFileName(F)
  If FSO.FolderExists(F) Then
    Test = 1 : BN = FN
  ElseIf FSO.FileExists(F) Then
    Test = 0 : BN = FSO.GetBaseName(FN)
    Ex = FSO.GetExtensionName(F) : If C < 5 And Len(Ex) Then Ext = "." & Ex
  End If : Max = 0 : If C = 5 Then FN = FSO.GetBaseName(F) & Ext
  FP = FSO.BuildPath(Path, FN) : Exist = (FSO.FolderExists(FP) Or FSO.FileExists(FP))
  If Rgx.Test(BN) Then
    M = Rgx.Execute(BN)(0).SubMatches(1) : Max = M : BN = Left(BN, Len(BN) - Len(M))
  ElseIf Right(BN, Len(Px)) <> Px Then
    n = 1
    For i = 1 To Len(Px)
      If Left(Px, i) = Right(BN, i) Then n = i
    Next : BN = BN & Mid(Px, n)
  End If : Set Items = ShA.NameSpace(Path).Items
  Items.Filter 73952, BN & "*" & Ext
  For Each i in Items
    If Test = 0 Then FF = FSO.GetBaseName(i.Path) Else FF = FSO.GetFileName(i.Path)
    If Replace(Ext, ".", "") = FSO.GetExtensionName(i.Path) Then _
    If Rgx.Test(FF) Then Set FN = Rgx.Execute(FF)(0) : M = FN.SubMatches(1) :_
    If CLng(M) > CLng(Max) And FN.SubMatches(0) = Left(FN.SubMatches(0), Len(BN & Px)) Then Max = M
  Next : Cnt = Count
  If Not Exist Then Create Test, F, FP, Ext : Cnt = Count - 1
  If Cnt Then
  For i = 1 To Cnt
    If Rgx.Execute(Max)(0).SubMatches(2) = "" Then
      Max = Max + 1
    Else
      If Len(Max + 1) >= Len(Max) Then Max = Max + 1 Else _
      Max = String(Len(Max) - Len(Max + 1), "0") & Max + 1
    End If : If Two And Max < 2 Then Max = 2
    FP = FSO.BuildPath(Path, BN & Max) & Ext
    Create Test, F, FP, Ext
  Next
  End If
Loop Until List.AtEndOfStream : CreateObject("WScript.Shell").SendKeys "^r"

Sub Create(T, Fl, PF, E)
  If T Then
    If C = 5 Then FSO.CreateFolder   PF Else FSO.GetFolder(Fl).Copy PF, 0
  Else
    If C = 5 Then FSO.CreateTextFile PF Else FSO.CopyFile Fl, PF, 0
  End if
End Sub
[/cut]
Последний раз редактировалось Flasher Вт окт 10, 2017 03:57, всего редактировалось 1 раз.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Dimsok
Сообщения: 664
Зарегистрирован: Вс авг 17, 2014 00:45

Сообщение Dimsok »

О, Flasher вернулся со скриптами и как всегда ночью :D .
В отсутствии практики теряешь сноровку.
Если копировать "файл", то можно сделать успешно это лишь один раз с созданием "файл 2" (при использовании параметра /2). "Файл 3" не создаётся, пишет, уже имеется. А если пробовать копировать в этом случае "файл 2", то создаётся. "Файл 3" станет только файлом 4, но никак не 5. Вот такая закономерность замечена.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Dimsok
Соскучилси? :wink:
Файл без расширения? Параметры такие: %WL "%T" 1 " " /2 :?:
Я, может, слегка и подрастерял, но у меня всё как надо.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Dimsok
Сообщения: 664
Зарегистрирован: Вс авг 17, 2014 00:45

Сообщение Dimsok »

С расширением. Я это для примера взял, тестировал на файле supercopier.exe.
%WL "%T" 1 " " /2.
ОС что ли разницу делает.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Система x32 или x64?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Dimsok
Сообщения: 664
Зарегистрирован: Вс авг 17, 2014 00:45

Сообщение Dimsok »

32.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Тогда проблема в другом. Дай точные списки источника и получателя.
Dimsok писал(а):"Файл 3" станет только файлом 4, но никак не 5.
И это логично. Что не так?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Dimsok
Сообщения: 664
Зарегистрирован: Вс авг 17, 2014 00:45

Сообщение Dimsok »

Список самый минимальный. В источнике file.exe, в получателе file.exe, file 2.exe.

Добавлено спустя 4 минуты:
И это логично. Что не так?
Файл 3, а в получателе есть Файл с такими именем и Файл 4. Разве не должен он обозваться Файл 5? В прошлой версии так было, а если нет, тогда в чём смысл скрипта.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Не могу воспроизвести. Такой код что даст?:

Код: Выделить всё

Set Items = CreateObject("Shell.Application").NameSpace(36).Items
Items.Filter 73920, "explorer.exe"
For Each i In Items: MsgBox i :Next
Dimsok писал(а):а в получателе есть ... Файл 4.
А где ты об этом написал? Только про 3.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Dimsok
Сообщения: 664
Зарегистрирован: Вс авг 17, 2014 00:45

Сообщение Dimsok »

"explorer" в окне.
"Файл 3" станет только файлом 4, но никак не 5.
Имелось в виду не станет 5 со второго раза.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Dimsok писал(а):"explorer" в окне.
Без .exe?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Dimsok
Сообщения: 664
Зарегистрирован: Вс авг 17, 2014 00:45

Сообщение Dimsok »

Без.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Вот уж не думал, что на XP может быть такая бяка. Проверь сейчас.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Dimsok
Сообщения: 664
Зарегистрирован: Вс авг 17, 2014 00:45

Сообщение Dimsok »

Сейчас норм, благодарю.
Кстати, нет ли ограничений по количеству файлов, копируемых за раз? С прошлой версией помню иногда вообще ничего не копировалось и ошибок никаких не выскакивало.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Никаких ограничений по числу не было. Вряд ли проблема была с этим связана.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Ответить