Страница 10 из 13

Добавлено: Вт окт 10, 2017 00:15
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]

Добавлено: Вт окт 10, 2017 02:31
Dimsok
О, Flasher вернулся со скриптами и как всегда ночью :D .
В отсутствии практики теряешь сноровку.
Если копировать "файл", то можно сделать успешно это лишь один раз с созданием "файл 2" (при использовании параметра /2). "Файл 3" не создаётся, пишет, уже имеется. А если пробовать копировать в этом случае "файл 2", то создаётся. "Файл 3" станет только файлом 4, но никак не 5. Вот такая закономерность замечена.

Добавлено: Вт окт 10, 2017 03:05
Flasher
Dimsok
Соскучилси? :wink:
Файл без расширения? Параметры такие: %WL "%T" 1 " " /2 :?:
Я, может, слегка и подрастерял, но у меня всё как надо.

Добавлено: Вт окт 10, 2017 03:09
Dimsok
С расширением. Я это для примера взял, тестировал на файле supercopier.exe.
%WL "%T" 1 " " /2.
ОС что ли разницу делает.

Добавлено: Вт окт 10, 2017 03:13
Flasher
Система x32 или x64?

Добавлено: Вт окт 10, 2017 03:14
Dimsok
32.

Добавлено: Вт окт 10, 2017 03:19
Flasher
Тогда проблема в другом. Дай точные списки источника и получателя.
Dimsok писал(а):"Файл 3" станет только файлом 4, но никак не 5.
И это логично. Что не так?

Добавлено: Вт окт 10, 2017 03:27
Dimsok
Список самый минимальный. В источнике file.exe, в получателе file.exe, file 2.exe.

Добавлено спустя 4 минуты:
И это логично. Что не так?
Файл 3, а в получателе есть Файл с такими именем и Файл 4. Разве не должен он обозваться Файл 5? В прошлой версии так было, а если нет, тогда в чём смысл скрипта.

Добавлено: Вт окт 10, 2017 03:41
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.

Добавлено: Вт окт 10, 2017 03:47
Dimsok
"explorer" в окне.
"Файл 3" станет только файлом 4, но никак не 5.
Имелось в виду не станет 5 со второго раза.

Добавлено: Вт окт 10, 2017 03:48
Flasher
Dimsok писал(а):"explorer" в окне.
Без .exe?

Добавлено: Вт окт 10, 2017 03:54
Dimsok
Без.

Добавлено: Вт окт 10, 2017 03:58
Flasher
Вот уж не думал, что на XP может быть такая бяка. Проверь сейчас.

Добавлено: Вт окт 10, 2017 04:03
Dimsok
Сейчас норм, благодарю.
Кстати, нет ли ограничений по количеству файлов, копируемых за раз? С прошлой версией помню иногда вообще ничего не копировалось и ошибок никаких не выскакивало.

Добавлено: Вт окт 10, 2017 04:16
Flasher
Никаких ограничений по числу не было. Вряд ли проблема была с этим связана.