Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

[Script] Копирование файлов по списку
Goto page 1, 2, 3, 4, 5, 6, 7  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
SkYB



Joined: 04 Mar 2006
Posts: 23
Location: Киев

Post (Separately) Posted: Mon Jun 02, 2008 20:57    Post subject: Reply with quote

Пипл , подскажите есть ли в природе такой плаг , чтоб копировал из *.txt файла пути , на нужное мне место ? Принцип работы такой же как "Загрузка из списка" в ФТП.
Нужно для того , к примеру я на работе имею хороший инет и качаю двд фильмы и просую лабуду , сражу же её катализирую по папкам ( Кино , Музыка , Проги т.д.) и копирую с путями эти файлы , себе в список а потом в конце недели к примеру , прихожу с винтом и качаю всё это себе домой. Так вот надо бы тулзу или скрипт , чтоб вся эта операция происходила из списка автоматом. Помогите если знаете , а то надо очень.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2199
Location: Москва, Россия

Post (Separately) Posted: Tue Jun 03, 2008 09:41    Post subject: Reply with quote

SkYB wrote:
чтоб копировал из *.txt файла пути , на нужное мне место ?

Необходимо уточнение. "Нужное" место где задается? Оно одинаково для всех файлов в файле-списке?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
SkYB



Joined: 04 Mar 2006
Posts: 23
Location: Киев

Post (Separately) Posted: Tue Jun 03, 2008 12:49    Post subject: Reply with quote

Batya wrote:
SkYB wrote:
чтоб копировал из *.txt файла пути , на нужное мне место ?

Необходимо уточнение. "Нужное" место где задается? Оно одинаково для всех файлов в файле-списке?

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



Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2199
Location: Москва, Россия

Post (Separately) Posted: Tue Jun 03, 2008 14:20    Post subject: Reply with quote

Ставлю вопрос на примере.
Пусть файл Домой.txt содержит:
Code:
C:\File1.ext
C:\Folder1\File2.ext
C:\Folder2\Folder3\File3.ext

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

или
Code:
G:\File1.ext
G:\Folder1\File2.ext
G:\Folder2\Folder3\File3.ext
???
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
SkYB



Joined: 04 Mar 2006
Posts: 23
Location: Киев

Post (Separately) Posted: Tue Jun 03, 2008 14:45    Post subject: Reply with quote

Batya wrote:
Ставлю вопрос на примере.
Пусть файл Домой.txt содержит:
Code:
C:\File1.ext
C:\Folder1\File2.ext
C:\Folder2\Folder3\File3.ext

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


Да именно , первый вариант, просто перекопировать их на другой диск.
Пример списка
Quote:
d:\TEMP\Dawnloads\Videos\Ночная смена.avi
d:\TEMP\Dawnloads\Videos\Оно.avi
d:\TEMP\Dawnloads\VST\Tony Maserati API Presets\

а куда будут кидаться - просто в корень диска G (или другой необходимый на тот момент)
Quote:
G:\Ночная смена.avi
G:\Оно.avi
G:\Tony Maserati API Presets

на этом мне больше ничего не нужно.

Хотя скажу , что второй вами приведённый пример , тоже актуален и будет полезен , когда к примеру нужно чтоб некоторые файлы были в нужной директории ( это если уйма файлов накопилась , чтоб легче было их потом дома разбирать), но опять же это не перврочередная потребность Rolling Eyes
Back to top
View user's profile Send private message
DrShark



Joined: 21 Oct 2006
Posts: 891
Location: Kyiv, Ukraine

Post (Separately) Posted: Tue Jun 03, 2008 20:23    Post subject: Reply with quote

2SkYB
В своё время я написал Гислеру реквест о реализации такой задачи. Он сказал, что рассмотрит его Smile
Так что, возможно, в Total Commander 7.5... но не будем загадывать наперёд Smile
Back to top
View user's profile Send private message
SkYB



Joined: 04 Mar 2006
Posts: 23
Location: Киев

Post (Separately) Posted: Wed Jun 04, 2008 15:14    Post subject: Reply with quote

Так что , получается моя проблема пока не решаема любыми способами?
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2199
Location: Москва, Россия

Post (Separately) Posted: Wed Jun 04, 2008 15:34    Post subject: Reply with quote

SkYB
Немного терпения Wink
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
SkYB



Joined: 04 Mar 2006
Posts: 23
Location: Киев

Post (Separately) Posted: Wed Jun 04, 2008 16:53    Post subject: Reply with quote

Batya wrote:
SkYB
Немного терпения Wink

Понял , сидимс , ждёмс Very Happy
Back to top
View user's profile Send private message
Моторокер



Joined: 06 May 2005
Posts: 1482
Location: г. Пермь (читается Перьмь)

Post (Separately) Posted: Thu Jun 05, 2008 10:02    Post subject: Reply with quote

SkYB wrote:
Пипл , подскажите есть ли в природе такой плаг , чтоб копировал из *.txt файла пути , на нужное мне место ?

DiskDir от Гислера.
Создаёшь lst файл, заходишь в него как в архив и как обычно копируешь нужные файлы.
Используешь галочку «Учитывать каталоги» по назначению.
_________________
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2199
Location: Москва, Россия

Post (Separately) Posted: Tue Jun 24, 2008 13:43    Post subject: Reply with quote

SkYB
Не знаю, актуально ли еще...
Написал скрипт для копирования по списку. В принципе, скрипт можно написать в несколько строчек, но хотелось сделать максимально грамотно и красиво, поэтому получилось несколько длиннее Smile
Code:
'==============================================================================
' Копирование выделенных файлов\папок в противоположную панель ТС

' Параметры вызова из 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 ошибка не возникает, и путь к файлу-списку нужно вводить вручную.
_________________
Нет, я не сплю. Я просто медленно моргаю.


Last edited by Batya on Mon Jul 21, 2008 11:53; edited 8 times in total
Back to top
View user's profile Send private message
SkYB



Joined: 04 Mar 2006
Posts: 23
Location: Киев

Post (Separately) Posted: Tue Jun 24, 2008 19:31    Post subject: Reply with quote

Огромное спасибо , скрипт актуален как никогда. Только есть маленькая проблема - я сроду скрипты не использовал в командере - как и куда это дело нужно запихнуть и как с ним работать ? Embarassed
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2199
Location: Москва, Россия

Post (Separately) Posted: Wed Jun 25, 2008 10:37    Post subject: Reply with quote

SkYB
Создаешь текстовый файл с расширением vbs и указанным в секции "Код" содержимым. Перетаскиваешь этот файл на панель TC. Изменяешь получившуюся кнопку - указываешь нужные тебе параметры, в зависимости от варианта использования.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
SkYB



Joined: 04 Mar 2006
Posts: 23
Location: Киев

Post (Separately) Posted: Wed Jun 25, 2008 13:30    Post subject: Reply with quote

Batya wrote:
SkYB
Создаешь текстовый файл с расширением vbs и указанным в секции "Код" содержимым. Перетаскиваешь этот файл на панель TC. Изменяешь получившуюся кнопку - указываешь нужные тебе параметры, в зависимости от варианта использования.

Всё , огромное ещё раз спасибо , разобрался. Но есть ещё одна маленькая просьба - а можно ли в этот скрипт , вписать , чтоб он показывал какой нибудь прогресс бар с тем, что он копирует - а то когда файлов пару гигабайт - комп впадает в штопор , но не видно сколько осталось до конца процесса ? Трудно ли это сделать в этом скрипте ??? Rolling Eyes

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

и последнее , вот этот параметр
Quote:
0 - копирование с сохранением структуры вложенных папок (по умолчанию)
- чёгото не работает. Если я правильно понял , то он должен , те файлы которые в списке - перекопировать в указанную директорию с такиме же папками как в списке , пример:
Code:
D:\Games\Quake
F:\Movie\xxx.avi

и так же оно должно быть на нужном мне диске
Quote:
H:\Games\Quake
H:\Movie\xxx.avi
Back to top
View user's profile Send private message
Rodny



Joined: 24 Jan 2007
Posts: 948
Location: Могилёв, Беларусь

Post (Separately) Posted: Wed Jun 25, 2008 17:22    Post subject: Reply with quote

SkYB wrote:
что обозначают вот эти "параметры" - %L , %P , %T , %N и т.д.

Когда открыт диалог настройки панели инструментов - нажми Справка, откроется нужный раздел.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page 1, 2, 3, 4, 5, 6, 7  Next
Page 1 of 7

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group