Как скопировать несколько файлов в один?
Select messages from
# through # FAQ
[/[Print]\]

Total Commander -> Автоматизация Total Commander

#1: Как скопировать несколько файлов в один? Author: mike PostPosted: Thu Feb 10, 2005 09:15
    —
типа
copy *.txt all.txt
Только с помощью тотала, т.е отмечаем нужные файлы на панели жмем кнопку или комбинацию клавиш вводив имя результирующего файла и се

#2:  Author: BatyaLocation: Москва, Россия PostPosted: Thu Feb 10, 2005 14:48
    —
mike
Создай файлик *.vbs. Повесь его на кнопку. В параметрах пропиши %L. Код файла:
Code:
Dim FSO, TempFile, SelFile, WriteFile, OpenFile
Set FSO = CreateObject("Scripting.FileSystemObject")

ForReading   = 1 'Open a file for reading only. You can't write to this file
ForWriting   = 2 'Open a file for writing
ForAppending = 8 'Open a file and write to the end of the file

Set TempFile = FSO.OpenTextFile(WScript.Arguments(0), ForReading)

FileAll = InputBox("Введите имя файла", "Копирование содержимого", "all.txt")
if Len(FileAll) = 0 then
  A1 = MsgBox("Не задано имя файла!", vbOKOnly + vbExclamation, "Копирование содержимого")
  WScript.Quit(1)
End if

Set WriteFile = FSO.OpenTextFile(FileAll, ForAppending, True)
Do While Not TempFile.AtEndOfStream
  Set SelFile = FSO.GetFile(TempFile.ReadLine)
  Set OpenFile = FSO.OpenTextFile(SelFile, ForReading)
  WriteFile.Write OpenFile.ReadAll
  WriteFile.Write chr(13)
Loop

WScript.Quit

#3:  Author: mike PostPosted: Thu Feb 10, 2005 14:50
    —
Спасиб конечно, но похоже это не будет работать в win95-98

#4:  Author: BatyaLocation: Москва, Россия PostPosted: Thu Feb 10, 2005 15:04
    —
Не работает или "похоже"?

#5:  Author: mike PostPosted: Thu Feb 10, 2005 15:12
    —
в 95-98 скрипты отдельно устанавливаются или я не прав?

#6:  Author: BatyaLocation: Москва, Россия PostPosted: Thu Feb 10, 2005 15:25
    —
vbs должны работать (правда, с некоторыми отличиями) в любых Win.

#7:  Author: mike PostPosted: Thu Feb 10, 2005 15:37
    —
ну посмотрим, пока надо только в XP было, а то в нортоне слить нужна была - а на этих же файлах тотал не работает - а функция очень нужная - а нортон в ХП тормозит да умереть пора ему

#8:  Author: Сергеич PostPosted: Thu Feb 10, 2005 15:40
    —
Combain (Комбайн)

Version 1.1
Copyright © 2001, Tir Na Nog
http://tirna.narod.ru
tirna@narod.ru

ОПИСАНИЕ.

Программа Combain предназначена для сборки из нескольких файлов
одного.

Файлы, из которых собирается результрующий файл, могут быть заданы как
по маске (с символами *,?), так и находиться в файле-списке,
формируемом, например, средствами Total Commander'а.

Программа запускается из командной строки, но при возникновении
ситуации, когда какой-либо параметр не задан, появляется диалоговое
окно, в котором можно задать и изменить требуемые значения.

ИСПОЛЬЗОВАНИЕ.

Строка запуска.

combain.exe {<list-file>|<file-mask>} <destination file> [{/|-}d]

#9:  Author: BatyaLocation: Москва, Россия PostPosted: Thu Feb 10, 2005 15:40
    —
Будут проблемы - пиши, разберемся.

#10:  Author: mike PostPosted: Thu Feb 10, 2005 15:46
    —
В принципе и скрипт устраивает - можно поменять - разделитель напривер всавить какой ну и тп. Вомщем-то я думал это встроенное средство тотала есть такое, если команда copy *.txt all.txt делает это
Smile

#11:  Author: Сергеич PostPosted: Thu Feb 10, 2005 15:50
    —
и есть ещё одна старая тулса:

Combine for Windows Commander.
by GalanSoftWare (c) 2001
Usage: Combine4WC.exe <filelist> <param>
<filelist> - path to file list (generated by Windows Commander)
<param> -
N:<name> - filename without extension
E:<ext> - extension without filename

тоже работает....

#12:  Author: BatyaLocation: Москва, Россия PostPosted: Fri Feb 11, 2005 19:50
    —
mike
А есть и возможность средствами TC! Smile
Выделяешь, нажимаешь F5, вводишь маску "all12345*.txt", ОК, для каждого файла сказать "Дописать" и настоять на продолжении.
Небольшая тонкость - в маске файла приемника обязательно должна быть * и количество символов до * должно быть не меньше количества символов в самом длинном имени из копируемых файлов.

#13:  Author: mike PostPosted: Sat Feb 12, 2005 13:58
    —
Batya
Ну это не очень хорошо, а если имена файлов 30 символов или более? Sad(

#14:  Author: Сергеич PostPosted: Sat Feb 12, 2005 14:10
    —
ну тогда маску ставишь например all.txt? - со знаком вопроса или звездочки на конце.
Но вот только если файлов много впаривает жать на дописать и продолжить.

#15:  Author: mike PostPosted: Sat Feb 12, 2005 14:15
    —
Ну не уж такую фичу в тотале не могли сделать?
А перенаправление копированиия, например в null или nil есть?

#16:  Author: Сергеич PostPosted: Sat Feb 12, 2005 14:30
    —
Quote:
Ну не уж такую фичу в тотале не могли сделать?

Есть. собирает-разбирает. Но собирает только в том случае если сам он и разбирал.
Для остальных случаев видать автор считает, что рядовым юзерам это совсем не надо, а продвинутые и сами знают как собрать.
ИМХО он думает правильно, а то мож народ решит так архивы объединять или документы Ворда.... а потом жаловаться будет....

я кстати пару разобъединял файлики так: проходил групповым переименованием, а потом меню "файл" - "собрать".

#17:  Author: mike PostPosted: Sat Feb 12, 2005 14:33
    —
Вот как раз для рядовых-то и надо. Ну да ладно чего обсуждать, пора закрывать тему

#18:  Author: NakaRBLocation: Москва PostPosted: Sat Feb 12, 2005 17:49
    —
чего мучаетесь? в папку суете файлы для объединения, переименовываете их типа file01.txt, file02.txt,..,file99.txt. ставите курсор на первый файл в списке, лезете в меню Files|Combine files и жмем ОК. и еще раз ОК. и в панельке напротив получаем файлик file01.out с содержимым всех фалов. меняем разрешение на txt и радуемся Wink

#19:  Author: mike PostPosted: Mon Feb 14, 2005 07:33
    —
Я же уже говорил, нужно для Чайников, попробуй им объяснить это, особенно какой-нибудь бабуле которая мышью работать не умеет толком

#20:  Author: Сергеич PostPosted: Mon Feb 14, 2005 12:29
    —
Значит надо этой бабуле так давать файлы чтоб она легко смогла их собрать. Стандартно или с бат-файлом. В этом и фикус. А дай бабуле струмент в руки неизвестно что она удумает. Вы бы ещё ей хардлинки в руки дали..... Wink

#21:  Author: mike PostPosted: Mon Feb 14, 2005 12:34
    —
Она должна выбрать по куче файлов нужный, например через ctrl+q
просмотреть, а потом отмечая нужные их склеить - имена файлов какие есть не изменить

#22:  Author: doRn PostPosted: Mon Dec 31, 2007 18:00
    —
Есть куча файлов вида
a.001
a.002
b.001
b.002
c.001
c.002
...
можно как нить автоматически(не вручную по однаму) собрать их в
a.out
b.out
c.out
...
соответственно

#23:  Author: doRn PostPosted: Tue Jan 08, 2008 05:03
    —
без вариантов?

#24:  Author: BatyaLocation: Москва, Россия PostPosted: Thu Jan 10, 2008 19:29
    —
doRn
С варантами все просто - пара десятков строк в скрипте.
Сложно со временем.
Тебе срочно?

#25:  Author: МоторокерLocation: г. Пермь (читается Перьмь) PostPosted: Fri Jan 11, 2008 09:41
    —
doRn
Только 001 и 002?
Создать bat файл с именами файлов, удалить расширения, добавить copy в начале строк, продублировать имена и расширения для склеивания файлов.

#26:  Author: BatyaLocation: Москва, Россия PostPosted: Fri Jan 11, 2008 15:58
    —
doRn
С добавлением всех проверок и собственной сортировки по возрастанию номера в расширении получилось чуть больше 20 строк Smile
Только crc-сумму я не проверяю.
Code:
'=================================================================================
' Склеивание выделенных файлов.
' Два режима работы скрипта:

' 1. Склеиваются только файлы с цифровым расширением.
' Если после отбрасывания цифрового расширения у файлов останется какое-либо
'   расширение, то оно будет у итогового файла, иначе - расширение out:
' (*.001,...,*.999) -> *.out; (*.ext.001,...,*.ext.999) -> *.ext
' Папка (существующая) формирования итоговых файлов указывается вторым параметром.
' Параметры вызова из TC:
' %L "%T"
' или
' %L "%P"

' 2. Склеиваются все файлы в один, если вторым параметром указан файл, а не папка.
' Такой файл не должен существовать.
' Параметры вызова из TC:
' %L {путь итогового файла}
' Пример:
' %L "%Tresult.txt"
'=================================================================================
Option Explicit
' Проверяем число параметров
Dim Title
Title = "Склеивание выделенных файлов"
If WScript.Arguments.Count < 2 Then
  MsgBox "Неправильно заданы параметры!", _
    vbOKOnly + vbCritical, Title
  WScript.Quit
End If

Dim FSO, Out, Mode
Set FSO = CreateObject("Scripting.FileSystemObject")
Out = WScript.Arguments(1)
If FSO.FolderExists(Out) Then
  Mode = 1
Else
  If FSO.FileExists(Out) Then
    MsgBox "Файл " & Out & " уже существует!" & vbNewLine &_
           "Работа скрипта будет прервана.", _
           vbOKOnly + vbCritical, Title
    Set FSO = Nothing
    WScript.Quit
  Else
    Mode = 2
  End If
End If

Dim List, ListArr, WSH, L, Line
List = FSO.OpenTextFile(WScript.Arguments(0), 1).ReadAll
ListArr = Split(List, vbNewLine)

Set WSH = CreateObject("WScript.Shell")
Select Case Mode
  Case 1 Mode1Proc
  Case 2 Mode2Proc
End Select

Set WSH = Nothing
Set FSO = Nothing
WScript.Quit

Sub Mode1Proc
  Dim ListDic, Name, Ext, ExtOut, FileOut, PathOut, k
  Set ListDic = CreateObject("Scripting.Dictionary")
  For Each L In ListArr
    Ext = FSO.GetExtensionName(L)
    If IsNumeric(Ext) Then
      Name = FSO.GetBaseName(L)
      ExtOut = FSO.GetExtensionName(Name)
      If ExtOut = "" Then
        ExtOut = "out"
      Else
        Name = FSO.GetBaseName(Name)
      End If
      FileOut = Name & "." & ExtOut
      PathOut = Out & FileOut
      If FSO.FileExists(PathOut) Then
        WSH.Popup "Файл " & PathOut & " уже существует." & vbNewLine &_
                  "Склеивание в этот файл не будет выполнено!", _
                  1, Title, vbOKOnly + vbCritical
      Else
        If Not ListDic.Exists(PathOut) Then
          Set ListDic.Item(PathOut) = CreateObject("Scripting.Dictionary")
        End If
        ListDic(PathOut).Add CInt(Ext), L
      End If
    End If
  Next
  For Each L In ListDic.Keys
    Line = ""
    For k = 1 To 999
      If ListDic(L).Exists(k) Then
        Line = Line & "+""" & ListDic(L)(k) & """"
      End If
    Next
    Line = Mid(Line, 2)
    WSH.Run "%ComSpec% /c copy /b " & Line & " """ & L & """", 7, True
  Next
  Set ListDic = Nothing
End Sub

Sub Mode2Proc
  Line = ""
  For Each L In ListArr
    If FSO.FileExists(L) Then
      Line = Line & "+""" & L & """"
    End If
  Next
  Line = Mid(Line, 2)
  WSH.Run "%ComSpec% /c copy /b " & Line & " """ & Out & """", 7, True
End Sub


Добавлено: Переделал скрипт - теперь склеивать можно не только текстовые файлы.

#27: Как слить несколько текстовых файлов в один? Author: evshi PostPosted: Mon May 25, 2009 12:52
    —
Есть команда "Собрать файлы", но она работает, если файлы последовательно проименованы. А у меня разные названия.

1. Можно ли в таком случае как-то слить через total?
2. Если все таки по п.1 нельзя, то, в принципе, файлы через командную строку можно слить так "copy /b file.0000+file.0001+file.0002 file.result". Как это можно прикрутить в total? В идеале хотелось бы выделять нужные файлы и, нажав команду, получить результат.

#28:  Author: Worros PostPosted: Mon May 25, 2009 13:09
    —
Ctrl+M , потом собирать.

#29:  Author: ВахмуркаLocation: Большая деревня Москва PostPosted: Mon May 25, 2009 13:24
    —
Была утилитка под названием combain (именно так, а не combine). Поищи. Я сейчас не дома, а то бы выслал. Мне она в свое время много времени сэкономила. Встраивается в ТС.

#30:  Author: BatyaLocation: Москва, Россия PostPosted: Mon May 25, 2009 13:29
    —
evshi
Как собрать несколько файлов в один

 !  Avada:
Ссылка поправлена.

#31:  Author: LocKtaR-o-DarKLocation: Москва PostPosted: Mon May 25, 2009 14:56
    —
evshi
сценарий
Код:
@echo off
setlocal enabledelayedexpansion
for %%a in (%*) do set q=!q!+%%a
set
q=%q:~1%
copy
/b %q% result.txt

кнопка
Code:
TOTALCMD#BAR#DATA
%pp%\comp_f.cmd
%S
TOTALCMD.EXE,2
Соединить файлы

1

#32:  Author: aLexxLocation: Новокузнецк PostPosted: Tue May 26, 2009 02:59
    —
Прочёл статью по ссылке от Batya. Полезно, но...
Quote:
Как вариант: переименовываем файлики по виду file01.ext file02.txt

*.ext и *.txt ? Так и должно быть?

#33:  Author: BatyaLocation: Москва, Россия PostPosted: Tue May 26, 2009 09:39
    —
aLexx
Исходный пост на форуме - http://forum.wincmd.ru/viewtopic.php?p=2006#2006.
Просто D1P приводил сообщения к удобочитаемому виду и кое-где опечатался. Я поправил.

#34:  Author: МоторокерLocation: г. Пермь (читается Перьмь) PostPosted: Sat May 30, 2009 13:17
    —
Гислер не собирается улучшать эту функцию? Даже Нортон умел собирать любые файлы в один, а здесь введено явно искусственное ограничение.
1. Вначале сделай копию файлов, чтобы не удалить исходные.
2. Потом переименуй.
3. Потом курсор на первый файл.
4. И только после этого запусти функцию

#35:  Author: Tol!kLocation: Арзамас PostPosted: Sat May 30, 2009 14:38
    —
Модераторы
Тема дублирует эту, может склеить их?

Upd.
Подклеена тема "Как слить несколько файлов в один?"


Last edited by Tol!k on Mon Aug 10, 2009 00:31; edited 1 time in total

#36:  Author: МоторокерLocation: г. Пермь (читается Перьмь) PostPosted: Mon Aug 10, 2009 00:08
    —
Tol!k wrote:
Модераторы
Тема дублирует эту, может склеить их?

Добавлены сообщения из темы
Как слить несколько файлов в один?

#37:  Author: KatMuse PostPosted: Tue Jul 29, 2014 01:09
    —
Подскажите, пожалуйста, как добавить имена файлов в качестве разделителей, в скрипте, приведённом Batya? Спасибо!

#38:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Aug 06, 2014 11:41
    —
KatMuse wrote:
имена файлов в качестве разделителей

Это как?

#39:  Author: MVVLocation: Ростов-Дон PostPosted: Wed Aug 06, 2014 13:57
    —
Batya wrote:
Это как?

Видимо, как-то так:
Code:
-- Файл1.txt --
aaa
aaa
-- Файл2.txt --
bbb
bbb

#40:  Author: BeardFury78 PostPosted: Mon Feb 06, 2017 09:54
    —
Никто не может сделать кнопку, который бы объединял выделенные текстовые файлы в активной панели в один текстовый файл, которые будет размещаться в папке на пассивном панели? И чтобы также можно было объединять файлы на панеле результатов поиска. Буду благодарен за решение задачи, сам искал на форуме, но ничего не нашлось.

 !  Avada:
Это сообщение и всё последующее обсуждение перенесены из темы по обсуждению обмена кнопками в более подходящее место, а сама тема — в Автоматизацию.

#41:  Author: ВахмуркаLocation: Большая деревня Москва PostPosted: Mon Feb 06, 2017 11:49
    —
BeardFury78 wrote:
сам искал на форуме, но ничего не нашлось
Чегой-то не верится. Как-то совсем...

#42:  Author: Dimsok PostPosted: Mon Feb 06, 2017 12:00
    —
Если не нужен уникод, то можно так:
Code:
TOTALCMD#BAR#DATA
cmd /c type
%P%S > "%Tmerged.txt"
%COMMANDER_PATH%\Totalcmd.exe,3
Объединить выбранные txt

1
-1


Добавлено спустя 27 минут:

Впрочем, вот с utf 8

Code:
TOTALCMD#BAR#DATA
cmd /c chcp 65001 &&
type %P%S > "%Tmerged.txt"
%COMMANDER_PATH%\Totalcmd.exe,3
Объединить выбранные txt (utf8)

1
-1

#43:  Author: BeardFury78 PostPosted: Mon Feb 06, 2017 12:30
    —
Вахмурка
Искал по запросу "объединить текстовые файлы" и "слить текстовые файлы". Думал, раз по таким запросам не находит, то таких тем нет. Smile Спасибо за ссылки.
Dimsok
Спасибо за кнопку, но уникод нужен. А с второй кнопкой на панели результатов поиска пишет "Файл не найден". Без панели результатов поиска мне не обойтись. Можно ли что-нибудь в этом случае поправить?

#44:  Author: FlasherLocation: Москва PostPosted: Mon Feb 06, 2017 15:26
    —
BeardFury78
Чтобы собрать файлы с разной кодировкой, нужно проверить каждый и перекодировать. Это одной кнопкой не делается. Или искомые файлы в одной кодировке? Если да, то в какой?

Avada, перенеси, плиз, куда следует.

#45:  Author: BeardFury78 PostPosted: Mon Feb 06, 2017 18:20
    —
Flasher
Да не надо, уже пользуюсь скриптом от Batya.

#46:  Author: FlasherLocation: Москва PostPosted: Mon Feb 06, 2017 18:32
    —
BeardFury78
Это какой из? Хотя они оба морально устарели. Во втором так вообще многократный вызов cmd /c copy используется, да юникодные имена не читаются.

#47:  Author: BeardFury78 PostPosted: Mon Feb 06, 2017 18:39
    —
Flasher
Вот пользуюсь этим. Пока нет нареканий. Но если вы хотите, можете сделать вариант получше, буду тогда пользоваться вашим скриптом.

#48:  Author: FlasherLocation: Москва PostPosted: Mon Feb 06, 2017 18:41
    —
BeardFury78
Если нет нареканий, то к чему было?:
BeardFury78 wrote:
но уникод нужен

#49:  Author: BeardFury78 PostPosted: Mon Feb 06, 2017 18:44
    —
Flasher
Это к Dimsok-y было по поводу его первой кнопки до того как он добавил вторую кнопку.

#50:  Author: FlasherLocation: Москва PostPosted: Mon Feb 06, 2017 18:46
    —
BeardFury78
Какая разница к кому? Первая кнопка у него прекрасно запишет в Юникод (UTF-16 LE без ВОМ), UTF-7/8 и т.д., если сами файлы были в той же кодировке.

#51:  Author: BeardFury78 PostPosted: Mon Feb 06, 2017 18:52
    —
Flasher
Ну Dimsok сам утверждал, что если уникод не нужен, то можно пользоваться первой кнопкой, а так как файлы у меня только utf-8 в основном лежат, то думал, что такая кнопка не пригодится и не тестировал поэтому. Не знаю почему Dimsok так сказал. Smile

#52:  Author: FlasherLocation: Москва PostPosted: Mon Feb 06, 2017 18:54
    —
BeardFury78
Ибо не ведает, что творит.
Главное - это совпадение (с учётом BOM).
Хотя по сути это же будет и с приведённым скриптом. Правда, сейчас я бы клеил по-другому.

#53:  Author: Nick PostPosted: Sat Aug 26, 2017 14:16
    —
Кто подскажет скрипт, чтобы можно было:
Дописать все выделенные файлы в файл, который находится под курсором.
Получившийся файл имел название и расширение файла, который находился под курсором (с дополнением к имени (к примеру, "_общий файл")).
Возможность установки флага перезаписи или пропуска если такой файл уже существует.

По этой ссылке у меня скрипт вообще почему-то не работает.
Этот сценарий работает, но имя не берется по файлу, который под курсором и если такой файл уже существует, то происходит его перезапись...

#54:  Author: FlasherLocation: Москва PostPosted: Sat Aug 26, 2017 15:33
    —
Nick
Второй пункт противоречит первому.
Если файл находится где-нибудь в середине или в конце выделенного списка, то в какой последовательности записывать?

Сделал в той же (от первого).
Code:
'••••••••••••••••••••••••••••• 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

[+] Отладил работу при наличии пустых файлов.

#55:  Author: Nick PostPosted: Mon Sep 04, 2017 13:57
    —
Flasher wrote:
Второй пункт противоречит первому.
Имелось в виду, что создается новый файл (а не перезаписывается уже существующий) с новым именем.
Flasher wrote:
Если файл находится где-нибудь в середине или в конце выделенного списка, то в какой последовательности записывать?
Тогда, наверное по той сортировке, которая в текущий момент в TC.

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

─ Почему-то не работает при склеивании архива с файлом изображения. Question
Изображение не читается! При обычной склейке файлов через командную строку такого не происходит.
Например: copy "Новое изображение.jpg" /b + "Новый текстовый файл.txt" /b + "Новый архив.zip" /b "Новое изображение результат.jpg"

#56:  Author: AvadaLocation: Россия, Саратов PostPosted: Mon Sep 04, 2017 14:19
    —
Nick
Читабельный результат при склейке текстовых файлов с бинарниками — это что-то новое...

#57:  Author: FlasherLocation: Москва PostPosted: Mon Sep 04, 2017 18:44
    —
Nick wrote:
С параметрами "%O Новое имя%E" не получается.
Что именно не получается? Нет точки перед расширением? Так кто мешает поставить?

По поводу читабельности изображения, которое после соединения уже представляет из себя нечто иное, я тоже не особо понял. Цель читать такое и не ставилась. Скрипт клеит побайтово, аналогично copy /b.

#58:  Author: Lisabon PostPosted: Fri Sep 08, 2017 08:37
    —
Flasher
Решил попробовать твой скрипт: http://forum.wincmd.ru/viewpost.php?p=123838
но появляется ошибка:
Code:
Сценарий:   C:\ReadMe.vbs
Строка:   73
Символ:   5
Ошибка:   Недопустимый вызов или аргумент процедуры
Код:   800A0005
Источник:    Ошибка выполнения Microsoft VBScript

Кнопка:
Code:
TOTALCMD#BAR#DATA
C:\ReadMe.vbs
%WL "%P" 2 %N
C:\Windows\System32\WScript.exe,2
ReadMe


-1

Для проверки пробую объединить файлы с именами:
Code:
C:\AddDateTime.vbs
C:\CopyMove.vbs

P.S. Total Commander v9.0a 32-bit, Windows 8.1 64-bit

#59:  Author: FlasherLocation: Москва PostPosted: Fri Sep 08, 2017 16:56
    —
Lisabon
Не вижу ошибок. Скинь сами файлы.

#60:  Author: Lisabon PostPosted: Fri Sep 08, 2017 17:20
    —
Flasher
Quote:
Не вижу ошибок

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

Quote:
Скинь сами файлы

TestScript

#61:  Author: FlasherLocation: Москва PostPosted: Fri Sep 08, 2017 17:29
    —
Lisabon
ПОпробуй в 73 строке 1 поменять на 2. Если не поможет, то увы и ах.
Также обрати внимание на права записи. На других дисках поведение аналогичное?

#62:  Author: Lisabon PostPosted: Fri Sep 08, 2017 18:22
    —
Flasher
Quote:
ПОпробуй в 73 строке 1 поменять на 2

Не помогло.
Quote:
обрати внимание на права записи

Проверил на разных дисках, как на несъёмных и USB дисках и проблема проявляется везде. Другие твои скрипты, отрабатывают без проблем в тех же местах диска и запись файлов происходит. Попробовал команду copy на тех же дисках и местах и команда отработала без проблем, запись файла произошла. Бред, короче.

#63:  Author: FlasherLocation: Москва PostPosted: Fri Sep 08, 2017 18:30
    —
Lisabon
А так происходит вообще на любой глубине с любыми файлами? Или есть варианты?

#64:  Author: Lisabon PostPosted: Fri Sep 08, 2017 19:13
    —
Flasher
Quote:
так происходит вообще на любой глубине с любыми файлами

Пробовал на такую глубину запускать:
Code:
D:\Install\Other\Don't_Delete\TestScript
H:\FTK_8\Windows\TestScript
G:\LOCALE\TestScript

Объединять пробовал txt, bat, vbs, bar, jpg, amr, mkv

Так же пробовал на разных файловых системах: FAT, FAT32 и NTFS.
Quote:
есть варианты?

Без вариантов. Появляется ошибка.

#65:  Author: FlasherLocation: Москва PostPosted: Fri Sep 08, 2017 19:29
    —
Lisabon
Так. А файл-то со счётчиком пустой создаётся?

#66:  Author: Lisabon PostPosted: Fri Sep 08, 2017 19:53
    —
Flasher wrote:
файл-то со счётчиком пустой создаётся?

Да, файл создаётся пустым.

#67:  Author: FlasherLocation: Москва PostPosted: Fri Sep 08, 2017 20:01
    —
Lisabon
А с другими вариантами параметров как?

#68:  Author: Lisabon PostPosted: Fri Sep 08, 2017 20:28
    —
Flasher
Пробовал разные параметры:
Code:
%WL   |   %WL /del   |   %WL "%T" 2   |   %WL "%P" 0 %N

ошибка присутствует.
Что ещё... Файл список файлов в %TEMP% создается, при нажатии на кнопку.

#69:  Author: FlasherLocation: Москва PostPosted: Fri Sep 08, 2017 20:37
    —
Lisabon
Странно то, что на точно такой же метод используется ранее дважды, ругани нет. Попробуй в этой строке FP заключить в CStr(FP).

#70:  Author: Lisabon PostPosted: Fri Sep 08, 2017 20:57
    —
Flasher
Quote:
в этой строке FP заключить в CStr(FP)

Не помогает.

#71:  Author: FlasherLocation: Москва PostPosted: Fri Sep 08, 2017 21:03
    —
Lisabon
Было бы интересно ознакомиться с тестами на 8-ке. Может, кто-то ещё посмотрит. В данном случае без такой системы доп. мыслей пока нет. Я могу взять ADO (нет на WinPE, не такой шустрый) либо copy /b (как тут), если очень надо.
Могу через удалёнку взглянуть, если хочешь.

#72:  Author: Lisabon PostPosted: Fri Sep 08, 2017 21:52
    —
Quote:
либо copy /b (как тут), если очень надо

Если не затруднит, то сделай.

#73:  Author: Nick PostPosted: Fri Oct 20, 2017 12:03
    —
Flasher
Этот скрипт при склеивании файлов при параметрах: <%WL "%P" 2 %N> выдает следующую ошибку:

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

Где может быть ошибка?

#74:  Author: FlasherLocation: Москва PostPosted: Wed Nov 15, 2017 06:04
    —
Nick
Написано "Строка: 74." Вот там и ошибка. Smile Только на 7-ке этого нет, что выше и обсуждалось.
Интересно, что если над ней и под ней добавить по строке?:
Code:
  With CreateObject("SAPI.SpFileStream")
  <74 строка>
  End With
Lisabon, тоже советую проверить.

#75:  Author: Lisabon PostPosted: Wed Nov 15, 2017 19:19
    —
Quote:
что если над ней и под ней добавить по строке


Тобишь должно получится так? :
Code:
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) : If FP = Fi Then Buff = FMem : FMem = "" Else _
    .Open Fi, 2 : .Read Buff, Dic.Item(Fi) : .Close
    .Open FP, 1 : .Seek Fl.Size : .Write Buff : Buff = "" : .Close
    With CreateObject("SAPI.SpFileStream")
  Next
  End With
End With


Если да, то ошибка:
Code:
Сценарий:   D:\Program\Total_Commander\Scripts\JoinBinFiles.vbs
Строка:   75
Символ:   3
Ошибка:   Неуместное 'Next'
Код:   800A041F
Источник:    Ошибка компиляции Microsoft VBScript

#76:  Author: FlasherLocation: Москва PostPosted: Wed Nov 15, 2017 19:35
    —
Lisabon
Логика вставки верная. Но скрипт на строку увеличивался. Надо обновиться и переделать.

#77:  Author: Lisabon PostPosted: Wed Nov 15, 2017 19:51
    —
Quote:
Надо обновиться


Обновил скрипт и подправил, получил вот такое:
Code:
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
    With CreateObject("SAPI.SpFileStream") 
    .Open FP, 1 : .Seek Fl.Size : .Write Buff : Buff = "" : .Close
    End With
  Next
End With


Теперь ошибка вот такая:
Code:
Сценарий:   D:\Program\Total_Commander\Scripts\JoinBinFiles.vbs
Строка:   73
Символ:   5
Ошибка:   0x80045025
Код:   80045025
Источник:    (null)

Но теперь есть прогресс в лучшую сторону. Создаваемый (объединённый) файл теперь не пустой, а теперь в него копируется содержимое, только одного файла (первого) из трёх.

Кнопка у меня вот такая:
Code:
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Scripts\JoinBinFiles.vbs
%WL "%P" 2 %N
C:\Windows\System32\WScript.exe,2
JoinBinFiles


-1

#78:  Author: FlasherLocation: Москва PostPosted: Wed Nov 15, 2017 20:05
    —
Хм. А если так?:
Code:
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
End With
For i = N To Num - 1
  Fi = List(i) : C = 0 : If Left(Fi, 1) = "\" Then C = 2
  With CreateObject("SAPI.SpFileStream")
    If FP = Fi Then Buff = FMem : FMem = "" Else _
    .Open Fi, C : .Read Buff, Dic.Item(Fi) : .Close
  End With
  With CreateObject("SAPI.SpFileStream")
    .Open FP, 1 : .Seek Fl.Size : .Write Buff : Buff = "" : .Close
  End With
Next

#79:  Author: Lisabon PostPosted: Wed Nov 15, 2017 20:50
    —
Flasher
Quote:
А если так?

Скрипт работает. Ошибок и проблем пока не наблюдаю.

#80:  Author: FlasherLocation: Москва PostPosted: Wed Nov 15, 2017 21:01
    —
Lisabon
Эврика. Smile А с длинными путями как?

#81:  Author: Lisabon PostPosted: Wed Nov 15, 2017 21:21
    —
Flasher
Code:
А с длинными путями как?

Нормально.

#82:  Author: FlasherLocation: Москва PostPosted: Wed Nov 15, 2017 21:22
    —
Lisabon
Хорошо. Поздравляю.



Total Commander -> Автоматизация Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Page 1 of 1

Powered by phpBB © 2001, 2005 phpBB Group