Как скопировать несколько файлов в один?

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

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

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

Сообщение Flasher »

BeardFury78
Это какой из? Хотя они оба морально устарели. Во втором так вообще многократный вызов cmd /c copy используется, да юникодные имена не читаются.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
BeardFury78
Сообщения: 213
Зарегистрирован: Чт авг 25, 2016 05:24

Сообщение BeardFury78 »

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

Сообщение Flasher »

BeardFury78
Если нет нареканий, то к чему было?:
BeardFury78 писал(а):но уникод нужен
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
BeardFury78
Сообщения: 213
Зарегистрирован: Чт авг 25, 2016 05:24

Сообщение BeardFury78 »

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

Сообщение Flasher »

BeardFury78
Какая разница к кому? Первая кнопка у него прекрасно запишет в Юникод (UTF-16 LE без ВОМ), UTF-7/8 и т.д., если сами файлы были в той же кодировке.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
BeardFury78
Сообщения: 213
Зарегистрирован: Чт авг 25, 2016 05:24

Сообщение BeardFury78 »

Flasher
Ну Dimsok сам утверждал, что если уникод не нужен, то можно пользоваться первой кнопкой, а так как файлы у меня только utf-8 в основном лежат, то думал, что такая кнопка не пригодится и не тестировал поэтому. Не знаю почему Dimsok так сказал. :)
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

BeardFury78
Ибо не ведает, что творит. Изображение
Главное - это совпадение (с учётом BOM).
Хотя по сути это же будет и с приведённым скриптом. Правда, сейчас я бы клеил по-другому.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Nick
Сообщения: 107
Зарегистрирован: Пт дек 26, 2014 17:11

Сообщение Nick »

Кто подскажет скрипт, чтобы можно было:
─ Дописать все выделенные файлы в файл, который находится под курсором.
─ Получившийся файл имел название и расширение файла, который находился под курсором (с дополнением к имени (к примеру, "_общий файл")).
─ Возможность установки флага перезаписи или пропуска если такой файл уже существует.

По этой ссылке у меня скрипт вообще почему-то не работает.
Этот сценарий работает, но имя не берется по файлу, который под курсором и если такой файл уже существует, то происходит его перезапись...
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Nick
Второй пункт противоречит первому.
Если файл находится где-нибудь в середине или в конце выделенного списка, то в какой последовательности записывать?

Сделал в той же (от первого).

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

'••••••••••••••••••••••••••••• VBS ••••••••••••••••••••••••••••
' Бинарное соединение файлов, выделенных в активной панели ТC
'
' Параметры: %WL
' Дополнительные (иначе дозапись осуществляется в первый файл):
' "<путь получателя при создании>" <режим записи> "<имя файла>"
'
' Режим записи принимает следующие значения:
'  0 = перезаписывать существующий файл;     (по умолчанию)
'  1 = не создавать файл при существовании;
'  2 = добавлять счётчик к имени нового файла.
'
' Ключ для удаления исходных файлов: /del
'
' Примеры:   %WL /del   |   %WL "%T" 2   |   %WL "%P" 0 %N
'••••••••••••••••••••••••••••••••••••••••• Автор: Flasher © •••

Option Explicit: Dim Mode, Del, C, List, Name, Path, Er, Rgx,_
Col, Dic, FSO, FP, BN, Ext, i, Fi, N, Num, Fl, Arr, FMem, Buff

With WSH.Arguments
  Mode = 0 : Del = .Named.Exists("del")
  C = .UnNamed.Count : If C = 0 Then WSH.Quit
  List = .Item(0) : If C = 4 Then Name = .Item(3)
  If C > 1 Then Path = .Item(1) : Mode = .Item(2)
End With

If C = 3 Then
  Set Rgx = New RegExp : Rgx.Pattern = "[""/*\\:|?<>]"
  While Rgx.Test(Name) Or IsEmpty(Name)
    If Not IsEmpty(Name) Then Er = Space(38) & "Некорректное имя!"
    Name = RTrim(InputBox(String(3, vbCr) & Er & vbCr & vbCr &_
    "Введите имя нового файла:", " Соединение файлов", Name))
  Wend : If Name = "" Then WSH.Quit
End If

Set Col = CreateObject("Scripting.Dictionary")
Set Dic = CreateObject("Scripting.Dictionary")
Set FSO = CreateObject("Scripting.FileSystemObject")
If C > 1 Then
  FP = FSO.BuildPath(Path, Name)
  If Len(FP) > 259 Then FP = "\\?\" & FP : Path = "\\?\" & Path
  If Mode = 1 Then
    If FSO.FileExists(FP) Or FSO.FolderExists(FP) Then WSH.Quit
  ElseIf Mode = 2 Then
    BN = FSO.GetBaseName(Name) : Ext = FSO.GetExtensionName(FP)
    If Len(Ext) Then Ext = "." & Ext
    While FSO.FileExists(FP) Or FSO.FolderExists(FP)
      i = i + 1 : FP = FSO.BuildPath(Path, BN & " (" & i & ")" & Ext)
    Wend
  End If
End If

Set List = FSO.OpenTextFile(List,,,-1)
Do : Fi = List.ReadLine
  If Len(Fi) > 259 Then Fi = "\\?\" & Fi
  If FSO.FileExists(Fi) Then Col.Add Fi, "" : _
  Num = FSO.GetFIle(Fi).Size : If Num Then Dic.Add Fi, Num
Loop Until List.AtEndOfStream : List.Close : N = 0
Num = Dic.Count : If Num = 0 Then WSH.Quit
Arr = Col.Keys : If C = 1 Then FP = Arr(0)
List = Dic.Keys : If Num = 1 And FP = List(0) Then WSH.Quit
If Not FSO.FileExists(FP) Then FSO.CreateTextFile(FP).Close
Set Fl = FSO.GetFile(FP) : If C = 1 And Dic.Exists(FP) Then N = 1

With CreateObject("SAPI.SpFileStream")
  If Dic.Exists(FP) And FP <> List(0) Then _
  .Open FP, 2 : .Read FMem, Fl.Size :_
  .Close : Fl.OpenAsTextStream(2).Close
  For i = N To Num - 1
    Fi = List(i) : C = 0 : If Left(Fi, 1) = "\" Then C = 2 
    If FP = Fi Then Buff = FMem : FMem = "" Else _ 
    .Open Fi, C : .Read Buff, Dic.Item(Fi) : .Close  
    .Open FP, 1 : .Seek Fl.Size : .Write Buff : Buff = "" : .Close
  Next
End With

If Del Then For Each i in Arr :_
If i <> FP Then FSO.DeleteFile i, 1 End If : Next
CreateObject("WScript.Shell").PopUp _
"Файлы соединены!", 0.6, " Соединение файлов", 4160
[+] Отладил работу при наличии пустых файлов.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Nick
Сообщения: 107
Зарегистрирован: Пт дек 26, 2014 17:11

Сообщение Nick »

Flasher писал(а):Второй пункт противоречит первому.
Имелось в виду, что создается новый файл (а не перезаписывается уже существующий) с новым именем.
Flasher писал(а):Если файл находится где-нибудь в середине или в конце выделенного списка, то в какой последовательности записывать?
Тогда, наверное по той сортировке, которая в текущий момент в TC.

─ При написании имени в параметрах скрипта после %N (например, %N Общий файл) это имя добавляется после расширения, а хотелось бы, чтобы это было сделано до него. С параметрами "%O Новое имя%E" не получается.

─ Почему-то не работает при склеивании архива с файлом изображения. :?:
Изображение не читается! При обычной склейке файлов через командную строку такого не происходит.
Например: copy "Новое изображение.jpg" /b + "Новый текстовый файл.txt" /b + "Новый архив.zip" /b "Новое изображение результат.jpg"
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

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

Сообщение Flasher »

Nick писал(а):С параметрами "%O Новое имя%E" не получается.
Что именно не получается? Нет точки перед расширением? Так кто мешает поставить?

По поводу читабельности изображения, которое после соединения уже представляет из себя нечто иное, я тоже не особо понял. Цель читать такое и не ставилась. Скрипт клеит побайтово, аналогично copy /b.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Lisabon
Сообщения: 147
Зарегистрирован: Чт фев 17, 2011 23:11

Сообщение Lisabon »

Flasher
Решил попробовать твой скрипт: http://forum.wincmd.ru/viewpost.php?p=123838
но появляется ошибка:

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

Сценарий:   C:\ReadMe.vbs
Строка:   73
Символ:   5
Ошибка:   Недопустимый вызов или аргумент процедуры
Код:   800A0005
Источник:    Ошибка выполнения Microsoft VBScript
Кнопка:

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

TOTALCMD#BAR#DATA
C:\ReadMe.vbs
%WL "%P" 2 %N
C:\Windows\System32\WScript.exe,2
ReadMe


-1
Для проверки пробую объединить файлы с именами:

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

C:\AddDateTime.vbs
C:\CopyMove.vbs
P.S. Total Commander v9.0a 32-bit, Windows 8.1 64-bit
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Lisabon
Не вижу ошибок. Скинь сами файлы.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Lisabon
Сообщения: 147
Зарегистрирован: Чт фев 17, 2011 23:11

Сообщение Lisabon »

Flasher
Не вижу ошибок
Может снова проявилась особенность 64-bit версии ОС. Попробовал на виртуальной Windows XP 32-bit и там такой ошибки нет.
Скинь сами файлы
TestScript
Ответить