Страница 3 из 8
Добавлено: Ср июл 27, 2011 09:25
Batya
shveicar писал(а):Здравствуйте. Сегодня опять пришлось обратиться к этому скрипту
Для каждой из папок из файла-списка очищаются вложенные папки
shveicar писал(а):Странно, не получается (вот пример из файла списка)
Код: Выделить всё
H:\1\CLARA-HU1-B-004\Video\CLARA-HU1-B-004-1280x720
H:\1\CLARA-HU1-B-004\Video\CLARA-HU1-B-004_video_640x368
Соответственно должны удалиться папки
Код: Выделить всё
CLARA-HU1-B-004-1280x720 и CLARA-HU1-B-004_video_640x368
Если использовался
приведённый выше скрипт, то он не будет удалять папки из файла-списка. И слэши здесь не при чём. Ещё раз - удаляются
вложенные папки для каждой папки из файла-списка. Т.е., если в файле списке содержится "H:\1\CLARA-HU1-B-004\Video", то тогда будут удалены все папки, вложенные в папку "H:\1\CLARA-HU1-B-004\Video", а сама папка останется.
Добавлено: Ср июл 27, 2011 09:40
Flasher
А ведь действительно. Удалять-то эти папки не имеет никакого смысла, в них же, исходя из ТЗ, перемещённые файлы останутся.
Добавлено: Ср июл 27, 2011 09:51
Batya
Если нужно перемещать на уровень вверх содержимое именно выделенных папок, то используем следующий скрипт:
Код: Выделить всё
'======================================================================
' Очищается каждая папка из файла-списка:
' файлы перемещаются в папку выше уровнем.
' При совпадении имён файлов выполняется автоматическое переименование.
' После выполнения переноса очищенные папки удаляются.
'
' Параметры:
' {файл-список}
'
' Пример параметров при вызове из TC:
' %L
'======================================================================
Option Explicit
Dim FSO, FF, F, oF
With WScript
If .Arguments.Count = 0 Then
MsgBox "Не заданы параметры!", vbOKOnly + vbCritical, "Очистка папок"
.Quit
End If
FF = .Arguments(0)
End With
Set FSO = CreateObject("Scripting.FileSystemObject")
With FSO.OpenTextFile(FF, 1)
Do While Not .AtEndOfStream
F = Trim(.ReadLine)
If F <> "" Then
If FSO.FolderExists(F) Then
Set oF = FSO.GetFolder(F)
On Error Resume Next
MoveFromFolder oF, oF.ParentFolder
If Err.Number = 0 Then FSO.DeleteFolder oF.Path
Err.Clear
On Error GoTo 0
End If
End If
Loop
.Close
End With
Set FSO = Nothing
WScript.Quit
Sub MoveFromFolder(pSubFolder, pFolder)
Dim lF
For Each lF In pSubFolder.Files
MoveFile lF, pFolder
Next
For Each lF In pSubFolder.SubFolders
MoveFromFolder lF, pFolder
FSO.DeleteFolder lF.Path
Next
End Sub
Sub MoveFile(pFile, pFolder)
Dim lF
lF = pFolder
If Right(lF, 1) <> "\" Then lF = lF & "\"
lF = NextName(lF & pFile.Name)
FSO.MoveFile pFile.Path, lF
End Sub
Function NextName(pFilePath)
Dim lPath, lName, lExt, li, lAdd
Const lQ = 1 'Минимальное количество цифр в номере
With CreateObject("Scripting.FileSystemObject")
lPath = .GetParentFolderName(pFilePath)
If lPath <> "" Then lPath = lPath & "\"
lName = .GetBaseName(pFilePath)
lExt = .GetExtensionName(pFilePath)
NextName = pFilePath
Do While .FileExists(NextName)
li = li + 1
If li < 10^lQ Then
lAdd = Right(String(lQ, "0") & li, lQ)
Else
lAdd = li
End If
NextName = lPath & lName & "(" & lAdd & ")." & lExt
Loop
End With
End Function
Добавлено: Ср июл 27, 2011 09:55
Flasher
Batya писал(а):перемещать на уровень вверх именно выделенные папки
Может, всё-таки содержимое выделенных папок, а не сами папки?
Добавлено: Ср июл 27, 2011 10:19
Batya
Flasher
ОК. Поправил.
Добавлено: Ср июл 27, 2011 13:10
shveicar
Спасибо Огромное Batya - отличный скрипт! (а то вручную удалять вложенные каталоги -с ума можно сойти особенно если их больше 500). И Спасибо Flasher - за помощь.
Добавлено: Ср июл 27, 2011 13:32
Flasher
shveicar писал(а):а то вручную удалять вложенные каталоги -с ума можно сойти
Зачем вручную? Был же уже
вариант.
Добавлено: Ср июл 27, 2011 15:47
shveicar
Зачем вручную?
Теперь при имеющимся скрипте, этот вариант не
удобен Поскольку речь идет о большом количестве
многоуровневых вложенных каталогов, приходится каждый раз заходить в выбранный каталог и уже после этого удалять
выделенные папки. До скрпта от Batya- приходилось так и делать. Жаль, что помочь
с этим вопросом у него видимо времени нет. Но все равно, Большое Спасибо.
Добавлено: Ср июл 27, 2011 16:07
Flasher
shveicar писал(а):Поскольку речь идет о большом количестве многоуровневых вложенных каталогов, приходится каждый раз заходить в выбранный каталог и уже после этого удалять выделенные папки.
Ничего не путаем? Мой скрипт сам удаляет очистившиеся папки. Никаких лишних телодвижений выполнять не требуется. Разница скриптов состоит только в том, что последний скрипт переименовывает файлы по глубине по счётчику, не затрагивая папки, а мой дублирует папки с совпавшими именами, которые находятся в активной панели. Кстати, в некоторых случаях удобней синхронизировать содержимое папок с одинаковыми названиями, чем бродить по всей глубине и производить пофайловое сравнение.
Добавлено: Ср июл 27, 2011 17:00
shveicar
Ну не знаю, если говорить именно об этом
скрипте то в моем случае он выдает
Код: Выделить всё
Сценарий: F:\total\Utils\test\3.vbs
Строка: 24
Символ: 10
Ошибка: Файл уже существует
Код: 800A003A
хотя файла дубликата в верхней папке нет.
Добавлено: Ср июл 27, 2011 17:06
Flasher
shveicar писал(а):хотя файла дубликата в верхней папке нет.
По логике в таком случае должен быть и одноимённый и переименованный файл. WScript из воздуха сообщение не покажет.
Добавлено: Ср июл 27, 2011 17:23
shveicar
Ну да, все правильно, ему(скрипту) в данном случае не нравятся имена -
некоторых папок, впрочем главное задача выполнена, а каждому инструменту, свое применение.Спасибо.
Добавлено: Ср июл 27, 2011 17:26
Flasher
shveicar писал(а):в данном случае не нравятся имена - некоторых папок
Например, каких?
Добавлено: Ср июл 27, 2011 17:52
shveicar
Хорошо- приведу кратко пример
Код: Выделить всё
H:\Cache\cdn.clara-g.com\CLARA-CZ1-A-003\SplittedVideos\5CLARA-CZ1-A-003-part5\
H:\Cache\cdn.clara-g.com\CLARA-CZ1-A-003\SplittedVideos\6CLARA-CZ1-A-003-part6\
список полных путей, при выделении одной папки например 5CLARA-CZ1-A-003-part5\ скрипт срабатывает и файл(с таким же именем что и папка) перемещается, но если выделить несколько папок
Код: Выделить всё
5CLARA-CZ1-A-003-part5\ и 6CLARA-CZ1-A-003-part6\
то он выдает ошибку, Понятно что ему не нравятся одинаковые имена папок и файлов(имена файлов вложенных в папки совпадают), а поскольку переименования по счетчику у него нет, вот он и капризничает. А теперь представте, В моей ситуации - лезть в каждую папку, и пытаться применить этот скрипт и проверять почему он срабатывает или нет, - сколько на это уйдет времени? Проще, конечно воспользоваться скриптом от Batya он сделает все что надо, останется только переименовать имена (если было совпадение) и отфильтровать дубликаты, -что также не сложно.[/code]
Добавлено: Ср июл 27, 2011 17:59
Flasher
Что-то мне подсказывает, что использовался первый вариант скрипта, а не последний. Так?