Удаление в 50 каталогах лишних папок, с сохранением файлов

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

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

Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

shveicar писал(а):поскольку как я понимаю все файлы из всех папок попадут в один общий (начальный)каталог
Неправильно понял. Нижеприведённый скрипт работает именно так, как ты хочешь. Работает по выделенным папкам - те самые твои "100 каталогов".

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

'======================================================================
' Для каждой из папок из файла-списка очищаются вложенные папки:
' файлы перемещаются в верхнюю папку (папка из файла-списка).
' При совпадении имён файлов выполняется автоматическое переименование.
' После выполнения переноса очищенные папки удаляются.
'
' Параметры:
' {файл-список}
'
' Пример параметров при вызове из TC:
' %L
'======================================================================
Option Explicit
Dim FSO, FF, F, SF

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
        For Each SF In FSO.GetFolder(F).SubFolders
          On Error Resume Next 
          MoveFromFolder SF, F
          If Err.Number = 0 Then FSO.DeleteFolder SF.Path
          Err.Clear
          On Error GoTo 0
        Next
      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
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
shveicar
Сообщения: 277
Зарегистрирован: Пн апр 18, 2011 01:54
Откуда: Россия Москва

Сообщение shveicar »

Офтоп удалён. п. 9 правил.

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

Сообщение Flasher »

shveicar писал(а):Скрипт -еще раз повторюсь срабатывает (правда выскакивает окно -перемещение файлов не было!), но файлы перемещаются.
Странно, такого не должно быть исходя из условия в скрипте.
shveicar писал(а):иначе бы некоторые картинки пропали так как при перемещении (в случае совпадения имен) один файл заменялся другим
Нет, в случае совпадения файл бы не переписывался.
shveicar писал(а):Что касается скрипта создающего каталоги (с указанием их кол-ва) c именами выделенных
папок/файлов- спасибо но это другое назначение.
Нужно было создать кучу пустых каталогов с счётчиком. Почему другое?
shveicar писал(а):создаю файл пустышку (например index.html) перемещаю его в папку Dol переименовываю исходный (index.html в 1.html) и дальше копирую (паку dol, вложенный в неё файл index.html и 1.html) во все созданные 100 каталогов сразу. Ну а затем проверяю скрипт от Flasherа. Мой вопрос про скрипт создающий 100 пустых папок зараз- был вызван именно тем моментом что приходилось каждый раз (когда я пытался проверить скрипт от Flashera) перемещать вручную созданные 100 каталогов в нужную мне директорию, а хотелось бы чтобы эти пустые каталоги сразу создавались в нужной мне директории. Конечно кто-нибудь может сказать, что можно было бы сделать все проще - но мой опыт работы, на данный момент весьма не велик и я делаю именно так. В любом случае буду рад услышать ваши советы, спасибо за информацию!
Я уже дал чёткий ответ как средствами ТС копировать каталог/файл в любое кол-во выделенных папок. Что не устроило в том варианте?
Аватара пользователя
shveicar
Сообщения: 277
Зарегистрирован: Пн апр 18, 2011 01:54
Откуда: Россия Москва

Сообщение shveicar »

Flasher -спасибо за помощь. Я уже разобрался. Надо мне было с самого начала больше читать и меньше задавать глупых вопросов.
Аватара пользователя
shveicar
Сообщения: 277
Зарегистрирован: Пн апр 18, 2011 01:54
Откуда: Россия Москва

Сообщение shveicar »

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

Сообщение Flasher »

shveicar
Так пойдёт?
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

shveicar писал(а):А возможно ли подредактировать скрипт от Batya ... ?
Если не устроит приведённый Flasher вариант, могу сделать.

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

Сообщение Flasher »

Batya писал(а):И я не понял, текущий вариант моего скрипта для предыдущей задачи работает?
Помнится, положительный ответ был дан в этом посте. Но "кто-то" его счёл целиком оффтопным...
Аватара пользователя
shveicar
Сообщения: 277
Зарегистрирован: Пн апр 18, 2011 01:54
Откуда: Россия Москва

Сообщение shveicar »

Спасибо большое Flasher - Это то, что надо! :lol:
shveicar
И я не понял, текущий вариант моего скрипта для предыдущей задачи работает?
Конечно работает. Еще раз Спасибо Batya -за внимание. :)
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

shveicar
Пожалуйста. Но всё-таки пусть Batya сделает, потому что у меня нет функции со счётчиком. Она нужна в ситуациях существования одноимённых файлов в выделенных директориях, чтобы переименовывать файлы с числовым приращением.

ЗЫ: :lol: - этот смайл ставят, когда смешно.
Аватара пользователя
shveicar
Сообщения: 277
Зарегистрирован: Пн апр 18, 2011 01:54
Откуда: Россия Москва

Сообщение shveicar »

Ну, если это возможно, - будет высший пилотаж!
Аватара пользователя
shveicar
Сообщения: 277
Зарегистрирован: Пн апр 18, 2011 01:54
Откуда: Россия Москва

Сообщение shveicar »

Здравствуйте. Сегодня опять пришлось обратиться к этому скрипту
Для каждой из папок из файла-списка очищаются вложенные папки
с параметрами %L -он работает хорошо(единственное иногда, приходится применять к одному и тому-же каталогу, по два раза, поскольку с первого удаляет не всё?) Но почему-то с файлом списком, он не работает (возможно я неправильно что-то делаю) Поэтому прошу совета. Мои действия
Создаю файл список с полными путями к удаляемым папкам, на конце пути знак/ (уровень вложенности удаляемых папок равен 3) Помещаю файл список в обрабатываемый каталог, (в кнопке(параметры) указываю полный путь к файлу списку без %L) выделяю файл список и каталог, жму кнопку и ничего не происходит? Что здесь не так?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

shveicar
Я вообще не понял, для чего этот набор ненужных манипуляций. Всё, что нужно - это создать список каталогов и указать путь к нему вместо %L (без всяких знаков на конце), выделять ничего в таком случае не требуется.
Аватара пользователя
shveicar
Сообщения: 277
Зарегистрирован: Пн апр 18, 2011 01:54
Откуда: Россия Москва

Сообщение 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
однако ничего не происходит. Проверил на созданных папках(чтобы не портить оригинал) - обнаружил, что дело видимо в именах папок(опять странно-ведь с параметром%L без списка папки удаляет), поскольку с примитивными именами скрипт работает, но вод ведь проблема, при указании пути типа

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

папка1\1\удаляемая папка\
(если на конце имени папки в списке нет знака(\) то вообще не работает), удаляются все папки кроме папка1. если изменить путь

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

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

Сообщение Flasher »

Попробуй заменить соотв. кусок на этот:

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

With FSO.OpenTextFile(FF, 1)
  Do While Not .AtEndOfStream
    If F <> "" Then
      If FSO.FolderExists(F) Then
      Set F = .GetFolder(.ReadLine)
        For Each SF In F.SubFolders
          On Error Resume Next
          MoveFromFolder SF, F
          If Err.Number = 0 Then FSO.DeleteFolder SF.Path
          Err.Clear
          On Error GoTo 0
        Next
      If F.Size = 0 Then F.Delete
      End If
    End If
  Loop
  .Close
End With
shveicar писал(а):если на конце имени папки в списке нет знака(\) то вообще не работает
Исходя из контекста я понял, что речь шла о пути в параметрах. К папкам, естественно, косую черту желательно указывать.
Ответить