Flasher

|
Posted: Thu Jun 22, 2017 13:26 Post subject: |
|
|
BeardFury78
Есть ситуации, где результат будет неверным. Да и сам способ индусский.
Вот дополненный вариант (+ работа с файлами только на чтение):
Code: | '====================================== VBS =======================================
' Копирование/перемещение заданного числа изменённых первыми (по умолч.)/последними
' файлов из подкаталога структуры выбранных папок с сохранением относительных путей
' Условие: путь запуска - пустой
' Параметры: %WL "<путь получателя>" <число файлов> <copy/move>
' Дополнительные: <флаг последних правок: 1> <флаг рекурсии: 1>
' Примеры: %WL "%T" 250 copy 0 1 | %WL "C:\Мой каталог" 10 move
'==================================================================================
With WSH.Arguments
C = .Count : If C = 0 Then WSH.Quit
If C < 4 Then MsgBox "Укажите 4, 5, 6 параметров!", 4144 : WSH.Quit
List = .Item(0) : Path = .Item(1) : Cnt = .Item(2) : Act = .Item(3)
If C > 4 Then Last = .Item(4) : If C = 6 Then Rec = .Item(5)
End With : If LCase(Act) = "copy" Then Par = ", True"
Set Targ = CreateObject("Shell.Application").NameSpace(Path)
Set Sort = CreateObject("System.Collections.Sortedlist")
Set FSO = CreateObject("Scripting.FileSystemObject")
IPath = FSO.BuildPath(FSO.GetAbsolutePathName(""), "\")
If IPath = FSO.BuildPath(Path, "\") Then WSH.Quit
Ln = Len(IPath) + 1 : Set List = FSO.OpenTextFile(List,,,-1)
Do : Fold = List.ReadLine
If FSO.FolderExists(Fold) Then ForFolder Fold
Loop Until List.AtEndOfStream : List.Close
If Last = 1 Then FOL = "последними" Else FOL = "первыми"
If LCase(Act) = "copy" Then Act = " Копирование" Else Act = " Перемещение"
MsgBox Space(26) & "Выполнено!", 4160, Act & " изменённых " & FOL & " файлов "
Sub ForFolder(Fd)
Set IFold = FSO.GetFolder(Fd)
For Each F In IFold.Files
Sort.Add DateDiff("s", 0, F.DateLastModified) & F.Name, F.Name
Next : DL = Sort.Count
If DL Then
RPath = FSO.BuildPath(FSO.BuildPath(Path, Mid(Fd, Ln)), "\")
If Not FSO.FolderExists(RPath) Then Targ.NewFolder(Mid(IFold.Path, Ln))
If Last = 1 Then UL = DL - Cnt : St = -1 Else St = 1 :_
If CLng(Cnt) > DL Then UL = DL - 1 Else UL = Cnt - 1 End If : Dl = 1
If UL < 0 Then UL = 0
For i = DL - 1 To UL Step St
Set File = FSO.GetFile(FSO.BuildPath(Fd, Sort.GetByIndex(i)))
A = File.Attributes : R = 0
If (A And 1) = 1 Then File.Attributes = A - 1 : R = 1
Execute "File." & Act & " RPath" & Par : If R Then _
FSO.GetFile(RPath & File.Name).Attributes = A :_
If LCase(Act) = "copy" Then File.Attributes = A
Next : Sort.Clear
End If : If Rec = 1 Then For Each F in IFold.SubFolders : ForFolder F : Next
End Sub |
_________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|