Страница 3 из 6

Добавлено: Пт янв 26, 2018 16:19
Lisabon
Flasher
суть автопереименования не в создании дублей, а в предотвращении перезаписи и необходимости содержать потенциально разные по содержимому файлы
А если содержимое одинаково, то получается дубляж.
А смысл в копиях в том же каталоге какой?
В папке ярлыка, а не папке исходного файла. Ярлык в одном месте, исходный файл в другом месте, а обрабатываемая рабочая копия возле ярлыка. Я просто привёл пример. Потребность такая, тоже возможна.
Это же не бэкапер или размножитель.
Но скрипт, выполняет и такую функцию тоже. Ведь копирование по ярлыку, уже подразумевает дубляж файла, но уже в том месте, где находится ярлык.

Добавлено: Пт янв 26, 2018 16:25
Flasher
Lisabon
Копирование по ярлыку никак не подразумевает дубляж. Это лишь побочное событие, о причинах которого я написал выше. Потребность-то возможна, но в контексте сабжа несколько сомнительна. Поэтому задача по размножению тут не ставится.

Добавлено: Пн янв 29, 2018 21:17
Flasher
Lisabon
Значит, вернёмся к ситуации. Посмотри, как там после правок.

Добавлено: Вт янв 30, 2018 12:08
Lisabon
Flasher
При кнопке:

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

TOTALCMD#BAR#DATA
C:\ReadMe.vbs
%WF "%T" copy /r
C:\Windows\System32\WScript.exe,2
ReadMe


-1
1.
При копировании с ярлыка файла/папки, так и не с ярлыка, а просто файл или папку, размер которых превышает 200 МБ , после операции копирования вылазит сообщение с ошибкой
Теперь ошибки не наблюдаю, но в конце операции, выскакивает окно с надписью "Выполнено!".

2.
с использованием имени ярлыка:
Цитата:
01 mka dvd-audio araw;24bit,96000hz,4608kbs.lnk

При копировании с ярлыка, выдаёт ошибку:

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

Сценарий:   C:\ReadMe.vbs 
Строка:   33 
Символ:   5 
Ошибка:   Требуется объект 
Код:   800A01A8 
Источник:    Ошибка выполнения Microsoft VBScript
Ошибки нет.

3.
при попытке копирования файла с именем:

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

01 mka dvd-audio araw;24bit,96000hz,4608kbs.mka
ничего не происходит.
Ничего не изменилось. Не копирует.

4.
В общем, есть ярлык, он в по одному пути, файл на который ссылается ярлык, не находятся рядом.
Я выбираю ярлык, с которого надо скопировать файл. В левой и правой файловой панелях, пути одинаковы и там находится только ярлык:
Изображение
Теперь результат немного другой и имеем два ярлыка вместо одного:
Изображение

5.
При копировании с ярлыка, копируется с файлом и сам ярлык:
Изображение

Добавлено: Вт янв 30, 2018 15:16
Flasher
Lisabon
5. Вот это вообще подстава.. Если её в расчёте на прогресс-бар обходить, то на чтение будет уходить куда больше времени... Делать?

Добавлено: Вт янв 30, 2018 15:30
Avada
Тема по очевидным причинам переносится из "Общих вопросов" в Автоматизацию.

Добавлено: Ср янв 31, 2018 10:31
Lisabon
Flasher
на чтение будет уходить куда больше времени...
На сколько больше?
Делать?
Делай.

Добавлено: Чт фев 01, 2018 14:19
Flasher
Lisabon писал(а):На сколько больше?
Зависит от длины списка и числа найденных lnk-копий.
Lisabon писал(а):Делай.
Ну, смотри..

[cut="Проверяй:"]

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

'•••••••••••••••••••••••• VBS ••••••••••••••••••••••••
' Копирование/перемещение выбранного по заданному пути
' с последующей заменой lnk-ярлыков на целевые объекты

' Условие:    путь запуска — пустой
' Примечание: в пути достаточно правильной буквы диска
'
' Параметры: %WF "<путь назначения>" <copy/move>
' Ключ системного автопереименования объектов: /r

' Примеры:   %WF "%PMy Folder" copy /r
'            %WF D:\New\New2\New3\New4\New5 move
'•••••••••••••••••••••••••••••••• Автор: Flasher © •••

Option Explicit : Dim A, FSO, CD, T, Ren, Dic, Del, Col,_
ShA, Fds, TPath, Dash, D, All, Sp, oList, oFolder, Targ,_
NP, Items, N, BN, Ex, c, Equal, Exist, Nr, List, F, Ext

Set A = WSH.Arguments : If A.Count = 0 Then WSH.Quit
Set FSO = CreateObject("Scripting.FileSystemObject")
CD = FSO.BuildPath(FSO.GetAbsolutePathName(""), "")
T = Timer: If A.Named.Exists("r") Then Ren = 8
Set Dic = CreateObject("Scripting.Dictionary")
Set Fds = CreateObject("Scripting.Dictionary")
Set Col = CreateObject("Scripting.Dictionary")
Set Del = CreateObject("Scripting.Dictionary")
Set ShA = CreateObject("Shell.Application")
TPath = FSO.BuildPath(A(1), "")
If LCase(A(2)) = "move" And StrComp(CD, TPath, 1) = 0 Then WSH.Quit
With CreateObject("CDO.Message")._
AddAttachment("res://shell32.dll/6/262").GetDecodedContentStream
	.Type = 1 :	For c = 0 To 2 : D = .Read(AscB(.Read(2)) * 2) : Next
  If InStr(D, "-") Then Dash = "-" Else Dash = "—"
End With
D = FSO.GetDriveName(TPath)
ShA.NameSpace(D).NewFolder Mid(TPath, Len(D) + 2)
With CreateObject("SAPI.SpFileStream")
	.Format.Type = 1 : .Open A(0), 0
  .Read All, FSO.GetFile(A(0)).Size : .Close
End With : All = Mid(CStr(All), 2)
Set oList = FSO.OpenTextFile(A(0),,,-1)
Set oFolder = ShA.NameSpace(CD)
Set Targ = ShA.NameSpace(TPath)
Set Items = oFolder.Items

Do : N = oList.ReadLine : D = N
  NP = CD & N : Equal = True : Exist = True
  If Right(N, 1) = "" Then
    If Ren Then
      Nr = N : BN = Replace(N, "", "") : c = 1
      While FSO.FolderExists(TPath & Nr)
        If c > 1 Then Ex = " (" & c & ")"
        Nr = BN & " " & Dash & " копия" & Ex : c = c + 1
      Wend : Fds.Add Nr, ""
    Else Fds.Add N, "" End If
  End If
  With oFolder.ParseName(N)
    If .IsLink Then NP = .GetLink.Path: N = FSO.GetFileName(NP):_
    Exist = FSO.FileExists(NP) Or FSO.FolderExists(NP) :_
    Equal = StrComp(FSO.GetParentFolderName(NP) & "", CD, 1) = 0
  End With
  If Exist And Not Dic.Exists(N) Then
    Nr = Replace(N, ";", "?")
    If Not (Ren = "" And Equal) Then
      Items.Filter 78064, Nr
      If Items.Count = 1 Then
        Sp = "" : If Equal Then Sp = " "
        If Not IsLnk(oFolder.ParseName(D), N) Then _
        List = List & ";" & Nr Else Dic.Add D, Sp & NP
      Else
        For Each F in Items
          If IsLnk(F, N) Then _
          If InStr(vbCr & All, vbCr & FSO.GetFileName(F.Path) &_
          vbCr) Then FSO.GetFile(F.Path).Delete(1)
        Next : Items.Filter 78064, Nr : c = 0
        If Items.Count > 1 Then
          For Each F in Items
            If IsLnk(F, N) Then
              If LCase(A(2)) = "move" Then Del.Add F.Path, ""
            Else Col.Add F.Path, "" End If : c = c + 1
            If c = Items.Count Then Exit For
          Next
        Else If Equal Then List = List & ";" & Nr Else Dic.Add D, NP
        End If
      End If
    Else If Equal Then Dic.Add D, " " & NP Else List = List &";"& Nr
    End If
  End If
Loop Until oList.AtEndOfStream : oList.Close

If IsEmpty(List) Then
  If Dic.Count = 0 And Col.Count = 0 Then WSH.Quit
Else
  Items.Filter 78064, MId(Replace(List, "", ""), 2)
  Execute "Targ." & A(2) & "Here Items, 12304 + Ren"
End If

For Each F in Del
  If FSO.FileExists(F) Then FSO.DeleteFile F, 1 Else FSO.DeleteFolder F, 1
Next
For Each N in Dic
  Nr = Dic(N) : F = LTrim(Nr) : D = 1
  If FSO.FileExists(F) Or FSO.FolderExists(F) Then
    If Left(Nr, 1) = " " Then If LCase(FSO._
    GetExtensionName(N)) = "lnk" Then FSO.DeleteFile N, 1 : D = 0
    Targ.CopyHere F, 12304 + Ren
    If LCase(A(2)) = "move" And D Then If FSO.FileExists(N) Then _
    FSO.DeleteFile N, 1 Else FSO.DeleteFolder N, 1
  End If
Next : Set Dic = Nothing : c = 1

For Each F in Col.Keys
  Ext = FSO.GetExtensionName(F) : If Len(Ext) Then Ext = "." & Ext
  BN = FSO.GetBaseName(F) : Ex = Ext : N = BN & Ex
  While FSO.FileExists(TPath & N) Or FSO.FolderExists(TPath & N)
    If c > 1 Then Ex = " (" & c & ")" & Ext
    N = BN & " " & Dash & " копия" & Ex : c = c + 1
  Wend : N = TPath & N : If Not (Ren = "" And c > 1) Then _
  If FSO.FileExists(F) Then FSO.CopyFile F, N Else FSO.CopyFolder F, N
  If LCase(A(2)) = "move" Then If FSO.FileExists(F) Then _
  FSO.DeleteFile F, 1 Else FSO.DeleteFolder F, 1
Next : Set Col = Nothing

For Each N in Fds : FFolder TPath & N : Next : Set Fds = Nothing
T = Timer - T
If T > 3 Then
  Dim Sec, Title : If T < 10 Then Sec = 2 Else If T < 30 Then Sec = 4
  Title = "Копирование": If LCase(A(2)) = "move" Then Title = "Перемещение"
  CreateObject("WScript.Shell").Popup "Выполнено!", Sec, " " & Title, 4160
End If

Function IsLnk(Item, N)
  If Right(N, 1) = "" Then IsLnk = False Else _
  IsLnk = Item.IsLink And LCase(Right(Item.Path, 4)) = ".lnk"
End Function

Sub FFolder(Folder)
  Dim oFold, File, Fold
  Set oFold = ShA.NameSpace(Folder)
  Set Items = oFold.Items : Items.Filter 78032, "*"
  For Each File in Items
    If IsLnk(File, "") Then oFold.CopyHere File._
    GetLink.Path, 12304 + Ren : FSO.DeleteFile File.Path, 1
  Next : Items.Filter 77984, "*"
  For Each Fold in FSO.GetFolder(Folder).SubFolders
    If FSO.FolderExists(Fold) Then FFolder Fold.Path
  Next
End Sub
[/cut]

Добавлено: Чт фев 01, 2018 16:58
Lisabon
Flasher
Проверяй:
При копировании с ярлыка появляется ошибка:

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

Сценарий:	C:\ReadMe.vbs
Строка:	39
Символ:	1
Ошибка:	Требуется объект
Код:	800A01A8
Источник: 	Ошибка выполнения Microsoft VBScript

Добавлено: Чт фев 01, 2018 17:05
Flasher
Lisabon
:shock: Бред какой-то. Это вообще никак не может быть связано с тем, ярлык это или что-то иное. Откуда там взяться ошибке, неясно. Проверь выполнение условия и параметры.

Добавлено: Чт фев 01, 2018 19:13
Lisabon
Flasher
Проверил, всё нормально с параметрами. Потом попробовал параметры, которые указаны в самом скрипте, как пример.
Пробовал на разных дисках, на разных файловых системах. Перемещал скрипт в разные папки и диски. Проверял доступ и владельца. Еще пробовал запускать скрипт на Win 7 64-bit, но проблема та же.

Еще интересное, в том, что, если ярлык находится в корне диска, то выдаёт ошибку:

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

Сценарий:	C:\ReadMe.vbs
Строка:	39
Символ:	1
Ошибка:	Требуется объект
Код:	800A01A8
Источник: 	Ошибка выполнения Microsoft VBScript
а если ярлык находится в папке какой-нибудь, то выдаёт ошибку:

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

Сценарий:	C:\ReadMe.vbs
Строка:	118
Символ:	3
Ошибка:	Требуется объект: 'Item'
Код:	800A01A8
Источник: 	Ошибка выполнения Microsoft VBScript

Добавлено: Чт фев 01, 2018 19:40
Flasher
Lisabon писал(а):если ярлык находится в корне диска
А. Вот касаемо расположения (опять же, конкретно ярлыков это не касается) подтверждаю. Исправил.
Lisabon писал(а):а если ярлык находится в папке какой-нибудь
Источник и получатель в точности какие? Хотя бы пару примеров. На Win x32 есть проблема?

Добавлено: Чт фев 01, 2018 21:21
Lisabon
Flasher
Ошибки:

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

Сценарий:   C:\ReadMe.vbs
Строка:   39
Символ:   1
Ошибка:   Требуется объект
Код:   800A01A8
Источник:    Ошибка выполнения Microsoft VBScript
уже нет, но теперь вместо нее, выдаёт ошибку:

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

Сценарий:   C:\ReadMe.vbs
Строка:   118
Символ:   3
Ошибка:   Требуется объект: 'Item'
Код:   800A01A8
Источник:    Ошибка выполнения Microsoft VBScript
причём без разницы, где находится ярлык, хоть в корне диска, хоть в другой папке.
Источник и получатель в точности какие?
Без разницы, хоть одинаковый или разный.
Хотя бы пару примеров
ИзображениеИзображениеИзображение
На Win x32 есть проблема?
На Win 8.0 32-bit ошибка:

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

Сценарий:   C:\ReadMe.vbs
Строка:   118
Символ:   3
Ошибка:   Требуется объект: 'Item'
Код:   800A01A8
Источник:    Ошибка выполнения Microsoft VBScript
есть.
На Win XP SP3 32-bit - ошибки нет.

Добавлено: Чт фев 01, 2018 21:41
Flasher
Lisabon
Ну, ладно так пруфами (да ещё в виде шотов) закидывать. Верю. Жаль, что такие косяки есть в некоторых версиях.
Пришлось в каждом месте условие прописать. Тестируй.

Добавлено: Чт фев 01, 2018 22:50
Lisabon
Flasher
Тестируй.
Теперь, такая ошибка:

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

Сценарий:	C:\ReadMe.vbs
Строка:	62
Символ:	7
Ошибка:	Требуется объект: 'Item(...)'
Код:	800A01A8
Источник: 	Ошибка выполнения Microsoft VBScript