[Script] Копирование файлов по списку

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

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

SkYB
Сообщения: 23
Зарегистрирован: Сб мар 04, 2006 19:52
Откуда: Киев

Сообщение SkYB »

Пипл , подскажите есть ли в природе такой плаг , чтоб копировал из *.txt файла пути , на нужное мне место ? Принцип работы такой же как "Загрузка из списка" в ФТП.
Нужно для того , к примеру я на работе имею хороший инет и качаю двд фильмы и просую лабуду , сражу же её катализирую по папкам ( Кино , Музыка , Проги т.д.) и копирую с путями эти файлы , себе в список а потом в конце недели к примеру , прихожу с винтом и качаю всё это себе домой. Так вот надо бы тулзу или скрипт , чтоб вся эта операция происходила из списка автоматом. Помогите если знаете , а то надо очень.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

SkYB писал(а):чтоб копировал из *.txt файла пути , на нужное мне место ?
Необходимо уточнение. "Нужное" место где задается? Оно одинаково для всех файлов в файле-списке?
Нет, я не сплю. Я просто медленно моргаю.
SkYB
Сообщения: 23
Зарегистрирован: Сб мар 04, 2006 19:52
Откуда: Киев

Сообщение SkYB »

Batya писал(а):
SkYB писал(а):чтоб копировал из *.txt файла пути , на нужное мне место ?
Необходимо уточнение. "Нужное" место где задается? Оно одинаково для всех файлов в файле-списке?
Ну походу это место диск G - который я вставляю в usb. Сам принцип работы меня бы устроил абсолютно , как работает "загрузка из списка" в фтп секции. Тобиш я нажимаю "кнопку" - следующее действие , спрашивается из какого списка.txt брать пути для копирования - я указываю путь и нажимаю ок, а следующее действие это копирование на активный в данный момент каталог , в моём случае диск G.

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

Сообщение Batya »

Ставлю вопрос на примере.
Пусть файл Домой.txt содержит:

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

C:\File1.ext
C:\Folder1\File2.ext
C:\Folder2\Folder3\File3.ext
Что в результате нужно получить на диске G?

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

G:\File1.ext
G:\File2.ext
G:\File3.ext
или

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

G:\File1.ext
G:\Folder1\File2.ext
G:\Folder2\Folder3\File3.ext
???
Нет, я не сплю. Я просто медленно моргаю.
SkYB
Сообщения: 23
Зарегистрирован: Сб мар 04, 2006 19:52
Откуда: Киев

Сообщение SkYB »

Batya писал(а):Ставлю вопрос на примере.
Пусть файл Домой.txt содержит:

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

C:\File1.ext
C:\Folder1\File2.ext
C:\Folder2\Folder3\File3.ext
Что в результате нужно получить на диске G?

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

G:\File1.ext
G:\File2.ext
G:\File3.ext
Да именно , первый вариант, просто перекопировать их на другой диск.
Пример списка
d:\TEMP\Dawnloads\Videos\Ночная смена.avi
d:\TEMP\Dawnloads\Videos\Оно.avi
d:\TEMP\Dawnloads\VST\Tony Maserati API Presets\
а куда будут кидаться - просто в корень диска G (или другой необходимый на тот момент)
G:\Ночная смена.avi
G:\Оно.avi
G:\Tony Maserati API Presets
на этом мне больше ничего не нужно.

Хотя скажу , что второй вами приведённый пример , тоже актуален и будет полезен , когда к примеру нужно чтоб некоторые файлы были в нужной директории ( это если уйма файлов накопилась , чтоб легче было их потом дома разбирать), но опять же это не перврочередная потребность :roll:
DrShark
Сообщения: 911
Зарегистрирован: Сб окт 21, 2006 20:27
Откуда: Kyiv, Ukraine
Контактная информация:

Сообщение DrShark »

2SkYB
В своё время я написал Гислеру реквест о реализации такой задачи. Он сказал, что рассмотрит его :)
Так что, возможно, в Total Commander 7.5... но не будем загадывать наперёд :)
SkYB
Сообщения: 23
Зарегистрирован: Сб мар 04, 2006 19:52
Откуда: Киев

Сообщение SkYB »

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

Сообщение Batya »

SkYB
Немного терпения ;)
Нет, я не сплю. Я просто медленно моргаю.
SkYB
Сообщения: 23
Зарегистрирован: Сб мар 04, 2006 19:52
Откуда: Киев

Сообщение SkYB »

Batya писал(а):SkYB
Немного терпения ;)
Понял , сидимс , ждёмс :D
Аватара пользователя
Моторокер
Сообщения: 1517
Зарегистрирован: Пт май 06, 2005 08:22
Откуда: г. Пермь (читается Перьмь)
Контактная информация:

Сообщение Моторокер »

SkYB писал(а):Пипл , подскажите есть ли в природе такой плаг , чтоб копировал из *.txt файла пути , на нужное мне место ?
DiskDir от Гислера.
Создаёшь lst файл, заходишь в него как в архив и как обычно копируешь нужные файлы.
Используешь галочку «Учитывать каталоги» по назначению.
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

SkYB
Не знаю, актуально ли еще...
Написал скрипт для копирования по списку. В принципе, скрипт можно написать в несколько строчек, но хотелось сделать максимально грамотно и красиво, поэтому получилось несколько длиннее :)

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

'==============================================================================
' Копирование выделенных файлов\папок в противоположную панель ТС

' Параметры вызова из TC:
' %L "%T" [{режим копирования}]
' где необязательный параметр {режим копирования} может принимать значения:
'   0 - если в файле-списке указана папка, а не файл, то вложенные файлы и папки
'       копируются с сохранением относительной структуры (по умолчанию);
'   1 - копирование всех файлов в корень целевой папки;
'   2 - копирование с созданием полной стуктуры вложенных папок относительно
'       корня диска
' Если 1-ый параметр указан пустым (""), то файл-список выбирается вручную
' Если 2-ой параметр указан пустым (""), то целевая папка выбирается вручную
'==============================================================================
Option Explicit
'===== Изменяемые параметры ===================================================
Const Overwrite    = False 'Признак перезаписи существующих файлов
Const IgnorePrefix = "file://localhost/" 'Игнорируемый префикс
'==============================================================================
Dim FSO, FileList, TargetDir, Mess, Mess1, List, F, Errors, MessMode
Dim FilesAmount, FoldersAmount, CopyMode, Depth, i, oSA, CopyFlags, WSH

SetMess
Set oSA = CreateObject("Shell.Application")
Set WSH = CreateObject("WScript.Shell")
CheckParam
List = Split(FSO.OpenTextFile(FileList, 1).ReadAll, vbNewLine)
If Overwrite Then
  CopyFlags = 16
Else
  CopyFlags = 0
End If

Set Errors = CreateObject("Scripting.Dictionary")
If CopyMode = 2 Then
  Set Depth = CreateObject("Scripting.Dictionary")
End If
FilesAmount   = 0
FoldersAmount = 0
For Each F In List
  F = Trim(F)
  If F <> "" Then
    If LCase(Left(F, Len(IgnorePrefix))) = LCase(IgnorePrefix) Then
      F = Mid(F, Len(IgnorePrefix) + 1)
    End If
    F = GetPath(F)
    On Error Resume Next
    Copy F, TargetDir
    On Error GoTo 0
  End If
Next
If FilesAmount > 0 Then
  Mess1 = Mess(6) & " " & FilesAmount & " " & Mess(7)
End If
If FoldersAmount > 0 Then
  Mess1 = Mess1 & vbNewLine & Mess(6) & " " & FoldersAmount & " " & Mess(13)
End If
If (FilesAmount = 0) And (FoldersAmount = 0) Then
  Mess1 = Mess(8)
End If
If Errors.Count > 0 Then
  MessMode = 2
Else
  MessMode = 3
End If
Mess1 = Mess1 & vbNewLine & JoinErr(Errors)
MessBox Mess1, MessMode

Quit

Sub CheckParam
  If WScript.Arguments.Count = 0 Then
    MessBox Mess(1), 1
    Quit
  End If
  If WScript.Arguments.Count < 2 Then
    MessBox Mess(2), 1
    Quit
  End If
  FileList  = WScript.Arguments(0)
  TargetDir = WScript.Arguments(1)
  Set FSO  = CreateObject("Scripting.FileSystemObject")
  If FileList = "" Then
    FileList = OpenFile
  Else
    FileList = GetPath(FileList)
  End If
  If TargetDir = "" Then
    TargetDir = OpenFolder
  Else
    TargetDir = GetPath(TargetDir)
  End If
  If Not FSO.FileExists(FileList) Then
    MessBox Mess(3), 1
    Quit
  End If
  If Not FSO.FolderExists(TargetDir) Then
    MessBox Mess(4), 1
    Quit
  End If
  If FSO.GetFile(FileList).Size = 0 Then
    MessBox Mess(5), 1
    Quit
  End If
  If WScript.Arguments.Count > 2 Then
    CopyMode = WScript.Arguments(2)
    If Not (CopyMode = 0 Or CopyMode = 1 Or CopyMode = 2) Then
      MessBox Mess(11), 1
      Quit
    End If
  Else
    CopyMode = 0
  End If
End Sub

Sub SetMess
  Set Mess = CreateObject("Scripting.Dictionary")
  Mess.Add 0,  "Копирование из файла-списка"
  Mess.Add 1,  "Не указаны входные параметры!"
  Mess.Add 2,  "Указаны не все входные параметры!"
  Mess.Add 3,  "Файл-список не существует!"
  Mess.Add 4,  "Целевая папка не существует!"
  Mess.Add 5,  "Файл-список пустой!"
  Mess.Add 6,  "Успешно скопировано"
  Mess.Add 7,  "файлов."
  Mess.Add 8,  "Ничего не удалось скопировать."
  Mess.Add 9,  "Не удалось выполнить копирование"
  Mess.Add 10, "по причине ошибки:"
  Mess.Add 11, "Неправильно указан режим копирования!"
  Mess.Add 12, "Успешно создано"
  Mess.Add 13, "папок."
  Mess.Add 14, "В целевой папке данный файл уже существует!"
  Mess.Add 15, "Выбирете целевую папку"
  Mess.Add 16, "Файл-список"
  Mess.Add 17, "Ошибка не известна."
  Mess.Add 18, "Введите путь к файлу-списку."
  Mess.Add 19, "Введено несуществующее имя файла." & vbNewLine & "Нажмите ""OK"" для повторного ввода."
End Sub

Function MessBox(pMess, pMode)
  Dim lIcon
  Select Case pMode
    Case 1 lIcon = vbCritical    + vbOKOnly
    Case 2 lIcon = vbExclamation + vbOKOnly
    Case 3 lIcon = vbInformation + vbOKOnly
    Case 4 lIcon = vbExclamation + vbOKCancel
  End Select
  MessBox = MsgBox(pMess, lIcon, Mess(0))
End Function

Function JoinErr(pDic)
  Dim lKey
  For Each lKey In pDic
    JoinErr = JoinErr & vbNewLine & vbNewLine & _
              Mess(9) & " """ & lKey & """ " & Mess(10) & _
              vbNewLine & pDic(lKey)
  Next
End Function

Sub Copy(pF, pTarget)
  Dim lF, oF, lTarget, oNS
  lTarget = pTarget
  If Right(lTarget, 1) <> "\" Then
    lTarget = lTarget & "\"
  End If
  If CopyMode = 2 Then
    lTarget = CopyFolderStructure(lTarget, pF)
  End If
  If FSO.FileExists(pF) Then
    If (Not Overwrite) And FSO.FileExists(lTarget & FSO.GetFile(pF).Name) Then
      Errors.Add pF, Mess(14)
    Else
      CreateFoldersTree lTarget
      Set oNS = oSA.NameSpace(lTarget)
      oNS.CopyHere pF, CopyFlags
      Set oNS = Nothing
      If Err.Number <> 0 Then
        Errors.Add pF, Err.Description
      Else
        If Not FSO.FileExists(lTarget & FSO.GetFile(pF).Name) Then
          Errors.Add pF, Mess(17)
        Else
          FilesAmount = FilesAmount + 1
        End If
      End If
    End If
  End If
  If FSO.FolderExists(pF) Then
    CreateFoldersTree lTarget
    Set oF = FSO.GetFolder(pF)
    If (CopyMode = 0) Or (CopyMode = 2) Then
      Set oNS = oSA.NameSpace(lTarget)
      oNS.CopyHere pF, CopyFlags
      Set oNS = Nothing
      If Err.Number <> 0 Then
        Errors.Add pF, Err.Description
      Else
        If Not FSO.FolderExists(lTarget & oF.Name) Then
          Errors.Add pF, Mess(17)
        Else
          FoldersAmount = FoldersAmount + 1
        End If
      End If
    End If
    If CopyMode = 1 Then
      For Each lF In oF.Files
        If (Not Overwrite) And FSO.FileExists(lTarget & lF.Name) Then
          Errors.Add lF.Path, Mess(14)
        Else
          Set oNS = oSA.NameSpace(lTarget)
          oNS.CopyHere lF.Path, CopyFlags
          Set oNS = Nothing
          If Err.Number <> 0 Then
            Errors.Add lF.Path, Err.Description
          Else
            If Not FSO.FileExists(lTarget & lF.Name) Then
              Errors.Add lF.Path, Mess(17)
            Else
              FilesAmount = FilesAmount + 1
            End If
          End If
        End If
      Next
      For Each lF In oF.SubFolders
        Copy lF.Path, lTarget
      Next
      Set lF = Nothing
    End If
    Set oF = Nothing
  End If
End Sub

Function CopyFolderStructure(pTarget, pPath)
  Dim lPath
  If FSO.FileExists(pPath) Then
    lPath = FSO.GetParentFolderName(pPath) & "\"
  Else
    lPath = FSO.GetAbsolutePathName(pPath) & "\"
  End If
  Depth.RemoveAll
  GetDepth lPath
  CopyFolderStructure = pTarget
  For i = Depth.Count To 1 Step -1
    CopyFolderStructure = CopyFolderStructure & Depth(i) & "\"
  Next
End Function

Sub CreateFoldersTree(pFolder)
  Dim lParentFolder
  If Not FSO.FolderExists(pFolder) Then
    lParentFolder = FSO.GetParentFolderName(pFolder)
    If Not FSO.FolderExists(lParentFolder) Then
      CreateFoldersTree(lParentFolder)
    End If
    FSO.CreateFolder(pFolder)
  End If
End Sub

Sub GetDepth(pPath)
  Depth.Add Depth.Count + 1, FSO.GetFolder(pPath).Name
  If FSO.GetDriveName(pPath) & "\" <> FSO.GetParentFolderName(pPath) Then
    GetDepth FSO.GetParentFolderName(pPath)
  End If
End Sub

Function OpenFile
  Dim Dlg, DlgResult
  On Error Resume Next
  Set Dlg = CreateObject("UserAccounts.CommonDialog")
  If Err.Number = 0 Then
    On Error GoTo 0
    Dlg.Filter = Mess(16) & " (*.*)|*.*"
    Dlg.Flags  = &H4 + &H8 + &H400 + &H1000 + &H80000
    DlgResult  = Dlg.ShowOpen
    If DlgResult Then
      OpenFile = Dlg.FileName
    End If
    Set Dlg = Nothing
    If Not DlgResult Then
      Quit
    End If
  Else
    On Error GoTo 0
    Do
      Dlg = InputBox(Mess(18), Mess(0))
      If Dlg = "" Then
        Quit
      Else
        Dlg = GetPath(Dlg)
      End If
      If Not FSO.FileExists(Dlg) Then
        Dlg = ""
        DlgResult = MessBox(Mess(19), 4)
        If DlgResult = vbCancel Then
          Quit
        End If
      End If
    Loop Until (Dlg <> "")
    OpenFile = Dlg
  End If
End Function

Function OpenFolder
  Dim oF, lSelect
  Set oF  = oSA.BrowseForFolder(0, Mess(15), 16)
  lSelect = Not (TypeName(oF) = "Nothing")
  If lSelect Then
    OpenFolder = oF.Self.Path
  End If
  Set oF  = Nothing
  If Not lSelect Then
    Quit
  End If
End Function

Function GetPath(pPath)
  GetPath = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(pPath))
End Function

Sub Quit
  Set Errors = Nothing
  Set Depth  = Nothing
  Set Mess   = Nothing
  Set FSO    = Nothing
  Set oSA    = Nothing
  Set WSH    = Nothing
  WScript.Quit
End Sub
В шапке скрипта можно по желанию изменить константу Overwrite значением True или False - признак перезаписи существующих файлов.
Параметры для разных вариантов использования:

* Копирование выделенных файлов\папок в противоположную панель ТС:
  • %L "%T" [{режим копирования}]
* Копирование файлов\папок из файла-списка в противоположную панель ТС:
  • {файл-список} "%T" [{режим копирования}]
* Копирование файлов\папок из файла-списка в указанную целевую папку:
  • {файл-список} {целевая папка} [{режим копирования}]
* Копирование выделенных файлов\папок в указанную целевую папку:
  • %L {целевая папка} [{режим копирования}]
* Копирование файлов\папок из файла-списка под курсором в указанную целевую папку:
  • %P%N {целевая папка} [{режим копирования}]
* Копирование выделенных файлов\папок в выбираемую при запуске папку:
  • %L "" [{режим копирования}]
* Копирование файлов\папок из выбираемого при запуске файла-списка в выбираемую при запуске папку:
  • "" "" [{режим копирования}]
Не русскоязычные пользователи могут соотвествующим образом изменить процедуру SetMess.

Добавлено: Теперь, если второй параметр пустой (""), целевую папку можно указать вручную.

Добавлено: Теперь, если первый параметр пустой (""), файл-список можно указать вручную. Изменен способ копирования. Добавлен вариант копирования (2) с полным копированием структуры.

Добавлено: Теперь у представленных в файле-списке файлов\папок игнорируется префикс "file://localhost/".

Добавлено: Теперь в параметрах можно использовать переменные окружения.
Исправлено: Если первый параметр пустой (""), на Windows Vista ошибка не возникает, и путь к файлу-списку нужно вводить вручную.
Последний раз редактировалось Batya Пн июл 21, 2008 11:53, всего редактировалось 8 раз.
Нет, я не сплю. Я просто медленно моргаю.
SkYB
Сообщения: 23
Зарегистрирован: Сб мар 04, 2006 19:52
Откуда: Киев

Сообщение SkYB »

Огромное спасибо , скрипт актуален как никогда. Только есть маленькая проблема - я сроду скрипты не использовал в командере - как и куда это дело нужно запихнуть и как с ним работать ? :oops:
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

SkYB
Создаешь текстовый файл с расширением vbs и указанным в секции "Код" содержимым. Перетаскиваешь этот файл на панель TC. Изменяешь получившуюся кнопку - указываешь нужные тебе параметры, в зависимости от варианта использования.
Нет, я не сплю. Я просто медленно моргаю.
SkYB
Сообщения: 23
Зарегистрирован: Сб мар 04, 2006 19:52
Откуда: Киев

Сообщение SkYB »

Batya писал(а):SkYB
Создаешь текстовый файл с расширением vbs и указанным в секции "Код" содержимым. Перетаскиваешь этот файл на панель TC. Изменяешь получившуюся кнопку - указываешь нужные тебе параметры, в зависимости от варианта использования.
Всё , огромное ещё раз спасибо , разобрался. Но есть ещё одна маленькая просьба - а можно ли в этот скрипт , вписать , чтоб он показывал какой нибудь прогресс бар с тем, что он копирует - а то когда файлов пару гигабайт - комп впадает в штопор , но не видно сколько осталось до конца процесса ? Трудно ли это сделать в этом скрипте ??? :roll:

p/s - и ещё я немного недопёр , что обозначают вот эти "параметры" - %L , %P , %T , %N и т.д. - что это и с чем его едят ? :)

и последнее , вот этот параметр
0 - копирование с сохранением структуры вложенных папок (по умолчанию)
- чёгото не работает. Если я правильно понял , то он должен , те файлы которые в списке - перекопировать в указанную директорию с такиме же папками как в списке , пример:

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

D:\Games\Quake
F:\Movie\xxx.avi
и так же оно должно быть на нужном мне диске
H:\Games\Quake
H:\Movie\xxx.avi
Аватара пользователя
Rodny
Сообщения: 949
Зарегистрирован: Ср янв 24, 2007 00:59
Откуда: Могилёв, Беларусь

Сообщение Rodny »

SkYB писал(а):что обозначают вот эти "параметры" - %L , %P , %T , %N и т.д.
Когда открыт диалог настройки панели инструментов - нажми Справка, откроется нужный раздел.
Ответить