Сравнение файлов в панелях по именам
Select messages from
# through # FAQ
[/[Print]\]

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

#1: Сравнение файлов в панелях по именам Author: LonerDLocation: Макеевка PostPosted: Sun Jun 16, 2013 15:43
    —
Можно ли каким-то нехитрым способом сравнить и выделить файлы (и каталоги) в панелях только по именам, не учитывая их размер, даты...
( cm_CompareDirs выделяет в панелях файлы с различающимися датами - это не то, что требуется )
Приходит только идея скрипта, который выполняет копирование списка имён в панелях и построчное сравнение этих списков...
Но может есть какой-то более простой способ?

#2:  Author: FlasherLocation: Москва PostPosted: Sun Jun 16, 2013 16:03
    —
Для разноразмерных было (отдельно для папок). Для любых папок было (у меня сейчас слегка исправленный вариант). Чисто по именам ещё такой вариант:
Code:
'=====================================================================
' Выделение в панелях одноимённых файлов и/или папок

' Параметры: "%P" "%T" <файлы/каталоги/всё: 1/2/3>
'======================= Путь к утилите TCFS2 ========================
TCFS2 = "%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe"
'=====================================================================
With WScript.Arguments
  If .Count < 3 Then MsgBox "Укажите все требуемые параметры!", 48,_
  Space(13) & "Выделение элементов в панели" : WScript.Quit
  P = .Item(0) : T = .Item(1) : C = .Item(2)
End With
With CreateObject("Scripting.FileSystemObject")
  Set P = .GetFolder(P) : Set T = .GetFolder(T)
End With
Set D = CreateObject("Scripting.Dictionary")
Set G = CreateObject("Scripting.Dictionary")

Select Case C
  Case 1 ForFolders List
  Case 2 ForFiles List
  Case 3 ForFolders List : ForFiles List
End Select : D.RemoveAll : G.RemoveAll : Set D = Nothing : Set G = Nothing

With CreateObject("InternetExplorer.Application")
  .Navigate("about:blank")
  T = .Document.ParentWindow.ClipboardData.GetData("text")
  .Document.ParentWindow.ClipboardData.SetData "text", Mid(List,1)
  CreateObject("WScript.Shell").Exec TCFS2 & " /ef msg($0B,0) ""tcm(2033) tcm(4002) tcm(2033)" & _
  " tcm(4001), test(L_isActive) | tcm(2033) tcm(4001) tcm(2033) tcm(4002)"" msg($0B,1) redraw()"
  .Document.ParentWindow.ClipboardData.SetData "text", Mid(T,1)
  .ExecWB 45, 2 : .Quit
End With : Wscript.Quit

Sub ForFolders(S)
  Set SFolders = P.SubFolders
  If SFolders.Count Then
    For Each F in SFolders     : D.Add F.Name, "" : Next
    For Each F in T.SubFolders : G.Add F.Name, "" : Next
    For Each F in D.Keys
      If G.Exists(F) Then S = S & vbnewline & F & "\"
    Next
  End If
End Sub

Sub ForFiles(S)
  For Each F in P.Files : D.Add F.Name, "" : Next
  For Each F in T.Files : G.Add F.Name, "" : Next
  For Each F in D.Keys
    If G.Exists(F) Then S = S & vbnewline & F
  Next
End Sub


P.S.: поиск! - поиск! - поиск! Twisted Evil

#3:  Author: LonerDLocation: Макеевка PostPosted: Mon Jun 17, 2013 19:53
    —
Спасибо!!!
Работает. Неспешно и не всегда стабильно (иногда после вызова скрипта ничего не происходит, нужно второй раз вызывать), но в целом - то что надо.
Для любых папок я уже давно использую почти ту конструкцию, что у тебя в посте.
А вот для файлов - не хватало.

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

#4:  Author: FlasherLocation: Москва PostPosted: Sun Jun 23, 2013 17:24
    —
LonerD
Пожалуйста. Тормоза и нестабильность возникает из-за занесения в буфер предыдущего значения. Криво отрабатывает компонент IE. Себе-то я делаю (портабельно) с другим компонентом, а тут предлагаю только с тем, что должен быть предустановлен в системе. Через консольную утилиту я могу заносить в буфер только через поток, но тогда нельзя будет скрыть окно консоли.
Могу убрать перезапись, но тогда в буфере будет список совпавшего.

#5:  Author: mwzLocation: Россия, Москва PostPosted: Fri Jun 28, 2013 11:33
    —
LonerD
Quote:
( cm_CompareDirs выделяет в панелях файлы с различающимися датами - это не то, что требуется )


cm_FileSync (в частности с галкой "Игнорировать дату" -- и при необходимости другими) и нажатие "Сравнить" (синхронизировать после этого не обязательно) -- не то, что надо?

#6:  Author: AvadaLocation: Россия, Саратов PostPosted: Fri Jun 28, 2013 12:43
    —
mwz
Выше уже абсолютно ясно (и абсолютно правильно) сказано:
LonerD wrote:
Сейчас у Гислера подобное сравнение можно сделать в инструменте синхронизации, но нет экспорта результатов сравнения на панель (по аналогии с экспортом результатов поиска).

Так что — как минимум, не совсем то.

#7:  Author: sa PostPosted: Fri Jun 28, 2013 14:14
    —
LonerD wrote:
Приходит только идея скрипта

Может, стоит попросить Гислера ввести в wincmd.ini один или два ключа, чтобы при сравнении файлов можно было игнорировать дату и размер файлов? По аналогии с существующим ключом 1hourdif=1…

#8:  Author: FlasherLocation: Москва PostPosted: Fri Jun 28, 2013 14:59
    —
Готовая команда всяко лучше ключей.

#9:  Author: MVVLocation: Ростов-Дон PostPosted: Fri Jun 28, 2013 15:25
    —
По-любому. Ключи - это путаница. А команда будет полезна, если надо использовать оба режима.

#10:  Author: AvadaLocation: Россия, Саратов PostPosted: Fri Jun 28, 2013 15:37
    —
sa
Если на то пошло, надо не ключи просить, а полноценные настроечные опции. Существуют файл-менеджеры, где это давным-давно реализовано либо в общем диалоге настроек, либо в специальном операционном диалоге сравнения, появляющемся после вызова соответствующей команды. Вообще говоря, второй вариант предпочтительнее.

#11:  Author: sa PostPosted: Fri Jun 28, 2013 15:57
    —
Flasher wrote:
Готовая команда всяко лучше ключей.
Сейчас уже имеются, как минимум 3 команды сравнения (Сравнить каталоги, Сравнить каталоги с учётом подкаталогов, Сравнить каталоги, скрыв одинаковые файлы). Потому и предложил ключ, который бы менял их поведение. А так захочется завести целых три дополнительных команды по аналогии с существующими…

Avada wrote:
надо не ключи просить, а полноценные настроечные опции.
Но храниться-то эти опции всё равно будут, скорее всего, в ключах.
А реализация интерфейса, разумеется, может быть разной.

#12:  Author: FlasherLocation: Москва PostPosted: Fri Jun 28, 2013 16:36
    —
MVV wrote:
если надо использовать оба режима.
Только режима 3.

Avada wrote:
Вообще говоря, второй вариант предпочтительнее.
Из контекста неясно, какой второй. Команды или опции в диалоге?

sa wrote:
Потому и предложил ключ, который бы менял их поведение.
Т.е. предлагается пользователю самому сторонними средствами менять значение этого ключа при выполнении нужной команды выделения? И какое тут тогда преимущество, если мы и так сейчас прибегаем к сторонним решениям?

#13:  Author: sa PostPosted: Fri Jun 28, 2013 16:50
    —
Flasher
Нет, как раз без сторонних средств в итоге хотелось бы обойтись(блокнот к ним не отношу).
Скорее, мне ближе вариант Avada с опциями в диалоге, где команда объединяет все три имеющиеся (опции с учётом подкаталогов и скрыть одинаковые) и дополнительными опциями учёта даты и размера.

#14:  Author: FlasherLocation: Москва PostPosted: Fri Jun 28, 2013 17:17
    —
sa
Т.е. при том или ином режиме мы должны каждый раз лазить в диалог настроек для того, чтобы выделять так, как нам нужно?

#15:  Author: AvadaLocation: Россия, Саратов PostPosted: Fri Jun 28, 2013 17:21
    —
Flasher wrote:
Из контекста неясно, какой второй. Команды или опции в диалоге?

Из контекста, ИМХО, как раз всё ясно.
Avada wrote:
либо в общем диалоге настроек, либо в специальном операционном диалоге сравнения, появляющемся после вызова соответствующей команды

Диалоговые опции в аналогичных программах предусмотрены по-любому. Но в одном случае они достаточно стабильные, долговременные, в общем диалоге настроек, а в другом — в операционном диалоге, более гибко регулируемые. Пример первой реализации — FreeCommander, примеры второй — Altap Salamander и SpeedCommander. Условный аналог соответствующих вариантов в TC (только для другой операции) — настройки архивации на странице "Архиваторы" и в диалоге упаковки.


Last edited by Avada on Fri Jun 28, 2013 17:32; edited 1 time in total

#16:  Author: sa PostPosted: Fri Jun 28, 2013 17:31
    —
Flasher wrote:
каждый раз лазить в диалог настроек

Имелись ввиду опции непосредственно диалога сравнения каталогов, возможное изменение которых предваряет саму операцию сравнения (OK).

#17:  Author: FlasherLocation: Москва PostPosted: Fri Jun 28, 2013 21:56
    —
sa wrote:
Имелись ввиду опции непосредственно диалога сравнения каталогов
Тема про сравнение (выделение) файлов и без диалога.

#18:  Author: AvadaLocation: Россия, Саратов PostPosted: Fri Jun 28, 2013 22:47
    —
Flasher
Тема, как нетрудно убедиться, про сравнение файлов и каталогов. А про отсутствующий на данный момент в TC специальный диалог уместно (или, наоборот, неуместно) рассуждать здесь ровно в той же степени, что и про гипотетические ключи и/или команды.

#19:  Author: FlasherLocation: Москва PostPosted: Fri Jun 28, 2013 22:53
    —
Avada
Смысл темы в расширении уже существующей команды выделения в двух панелях. Соответственно, о промежуточном диалоге рассуждать неправильно.

#20:  Author: AvadaLocation: Россия, Саратов PostPosted: Fri Jun 28, 2013 23:01
    —
Flasher
Топик-стартер, развивая им же созданную тему, написал:
LonerD wrote:
Имхо, это такая функция, которая должна бы быть по умолчанию в файловом менеджере.

Дальше и последовало обсуждение, в каком виде она там может быть по умолчанию. А степень уместности любого варианта гипотетической реализации, как уже было сказано, одинакова.

#21: Сравнение каталогов с выделением одинаковых имён Author: hjiapex PostPosted: Thu Apr 16, 2015 01:54
    —
Что мне нужно:
2 каталога, хочу, чтоб программа выделила мне файлы, совпадающие по имени. То есть я открывал 2 разных каталога со списками, нажимал - Выделение - Сравнить каталоги(она выделяла в активном каталоге файлы, которые НЕ повторяются по именам), затем инвертировал выделение (и выделялись соответственно файлы, которые повторяются по именам).
Проблема в следующем:
Теперь же при нажатии на кнопку "Сравнить каталоги" она выделяет почему то только ЧАСТЬ файлов, которые повторяются (примерно 70%). Что за прикол такой? Как теперь мне реализовывать сложное копирование списками?

#22:  Author: FlasherLocation: Москва PostPosted: Thu Apr 16, 2015 02:13
    —
Сравнение файлов в панелях по именам

#23:  Author: hjiapex PostPosted: Thu Apr 16, 2015 02:30
    —
Flasher wrote:
Сравнение файлов в панелях по именам

Я читал эту тему, но ничего не понял, что за скрипты и куда их вставлять...

#24:  Author: FlasherLocation: Москва PostPosted: Thu Apr 16, 2015 02:34
    —
hjiapex
В разделе Автоматизация Total Commander для таких случаев прикреплена памятка.

#25:  Author: hjiapex PostPosted: Thu Apr 16, 2015 02:47
    —
Сделал все по описанной схеме. При нажатии на скрипт пишет "Укажите все требуемые параметры" и все.

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

Flasher wrote:
hjiapex
В разделе Автоматизация Total Commander для таких случаев прикреплена памятка.

Где эти параметры указывать? В тексте скрипта? Или в настройках кнопки? Ни там ни там я не могу найти нужные параметры для указания...

#26:  Author: FlasherLocation: Москва PostPosted: Thu Apr 16, 2015 03:03
    —
Об этом написано в 5 пункте.

#27:  Author: hjiapex PostPosted: Thu Apr 16, 2015 03:10
    —
Flasher wrote:
Об этом написано в 5 пункте.

Ввел в поле Параметры: "%P" "%T" 1
При нажатии ничего не происходит, теперь даже ошибок никаких нет

#28:  Author: FlasherLocation: Москва PostPosted: Thu Apr 16, 2015 03:13
    —
hjiapex
В шапке также указан путь к утилите, которая по указанному либо исправленному пути должна несомненно присутствовать.


Last edited by Flasher on Thu Apr 16, 2015 03:15; edited 1 time in total

#29:  Author: hjiapex PostPosted: Thu Apr 16, 2015 03:14
    —
хотя вру, за всеми окнами открывается окно "Вы хотите разрешить этой веб странице доступ к буферу обмена". И потом при отмене пишет "TCFS2 Unavailable key Macros L_isActive"

#30:  Author: FlasherLocation: Москва PostPosted: Thu Apr 16, 2015 03:18
    —
TCFS2Tools тоже нужно поставить.

С буфером могу привести некоторую редакцию. Только обсуждание пора бы уже в тот топик переносить.

#31:  Author: hjiapex PostPosted: Thu Apr 16, 2015 03:23
    —
Flasher wrote:
TCFS2Tools тоже нужно поставить.

Эту утилиту я поставил еще до создание данного поста. Скачал утилиту, закинул в папку с программой, создал папку, как указана в скрипте. (utils/tcfs2/). Сейчас еще добавил 2 файла ДЛЛ в ту же папку, ничего не произошло. Что я делаю не так?

#32:  Author: FlasherLocation: Москва PostPosted: Thu Apr 16, 2015 03:26
    —
TCFS2Tools (посл. бета) - это не утилита, а вспомогательный модуль/библиотека для TCFS2. Как его установить, расписано в Readme.txt (4. Загрузка при запуске ТК).

Last edited by Flasher on Thu Apr 16, 2015 03:28; edited 1 time in total

#33:  Author: hjiapex PostPosted: Thu Apr 16, 2015 03:26
    —
Flasher wrote:
TCFS2Tools тоже нужно поставить.

С буфером могу привести некоторую редакцию. Только обсуждание пора бы уже в тот топик переносить.

Еще скинул ИНИ файл в ту же папку, теперь пишет ошибку "Функция не реализована 65551"

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

В архиве нет ридми файла

#34:  Author: FlasherLocation: Москва PostPosted: Thu Apr 16, 2015 03:34
    —
hjiapex wrote:
В архиве нет ридми файла
Ридми можно взять из релиза на wincmd.ru.

#35:  Author: hjiapex PostPosted: Thu Apr 16, 2015 03:43
    —
Ну вот смотрите.
Конфигурация- Цвета- для типов файлов- Добавить- Шаблон- вкладка Плагины- вписываю значение "TCFSTools.Autorun > 0" (без ковычек). Плагин, свойство, значение, все по дефолту? Правильно делаю?

#36:  Author: FlasherLocation: Москва PostPosted: Thu Apr 16, 2015 03:47
    —
hjiapex
Да, как и расписано, это всё следует после установки его как wdx-плагина.

Quote:
вписываю значение "TCFSTools.Autorun > 0" (без ковычек). Плагин, свойство, значение, все по дефолту? Правильно делаю?
Хотя нет. Только заметил. Это разбивка по полям. Значением должен быть только 0.

Last edited by Flasher on Thu Apr 16, 2015 03:53; edited 1 time in total

#37:  Author: hjiapex PostPosted: Thu Apr 16, 2015 03:51
    —
Flasher wrote:
hjiapex
Да, как и расписано, это всё следует после установки его как wdx-плагина.

то есть сначала нужно его установить как wdx? Как это сделать?

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

Flasher wrote:
hjiapex
Хотя нет. Только заметил. Это разбивка по полям. Значением должен быть только 0.

а куда вписывать TCFSTools.Autorun?

#38:  Author: FlasherLocation: Москва PostPosted: Thu Apr 16, 2015 03:58
    —
Как в справке ТС написано, только звезду в поле "Имя файла:" вбить и нажать Enter, чтобы можно было выбрать dll. Только после установки пути к папке TC в wincmd.ini не забыть бы ещё ручками поменять на переменную %COMMANDER_PATH%.

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

hjiapex wrote:
а куда вписывать TCFSTools.Autorun?
Там некорректное описание. Имеется в виду плагин - tcfs2tools, cвойство - Autorun, операция - >, значение - 0.

P.S.: не нужно оверквотить.

#39:  Author: hjiapex PostPosted: Thu Apr 16, 2015 04:09
    —
Как я понимаю, после регистрации wdx этого у меня появится строчка в выпадающем списке плагин - tcfs2tools, cвойство - Autorun? Я не понимаю, как обычные люди устанавливают все? Есть какой то четкий мануал по НАЧАЛЬНОЙ установке на ГОЛУЮ программу ваших плагинов, чтоб потом работали эти скрипты? Я клянусь не понимаю вашего последнего поста, куда там выбирать этот ДЛЛ и зачем в ИНИ прописывать %COMMANDER_PATH% если он и так там прописан в строчке cmd1=cd %COMMANDER_PATH%

#40:  Author: FlasherLocation: Москва PostPosted: Thu Apr 16, 2015 04:20
    —
hjiapex wrote:
Как я понимаю, после регистрации wdx этого у меня появится строчка в выпадающем списке плагин - tcfs2tools, cвойство - Autorun?
Именно.
hjiapex wrote:
Я не понимаю, как обычные люди устанавливают все?
Это те, что с IQ < 90? Я просто не особо секу в том, как отличать обычных от необычных.
hjiapex wrote:
Есть какой то четкий мануал по НАЧАЛЬНОЙ установке на ГОЛУЮ программу ваших плагинов, чтоб потом работали эти скрипты?
Эти? Пока только один обсуждается. Всё индивидуально. Во многих случаях всё это не требуется, поэтому расписывать для частных не нашлось потребности.

hjiapex wrote:
куда там выбирать этот ДЛЛ и зачем в ИНИ прописывать %COMMANDER_PATH% если он и так там прописан в строчке cmd1=cd %COMMANDER_PATH%
Dll выбирается в диалоге, вызываемом нажатием кнопки "Добавить" при стандартной установке плагина. Касаемо снятия фильтра по * я написал выше. Произвести замену на переменную среды нужно в пути к плагину в соотв. ключе секции ContentPlugins.

#41:  Author: hjiapex PostPosted: Thu Apr 16, 2015 04:34
    —
Flasher
Так, по порядку) wdx в настройках указал, ИНИ файл путь к нему поправил, в настройках цвета сделал tcfs2tools.autorun>0, передвинул скрипт на кнопку на панели быстрого доступа, добавил в usercmd.ini свой скрипт через выбор команд, со значениями, указанными в шапке скрипта. Вроде ВСЕ сделал, при запуске ничего не происходит

#42:  Author: FlasherLocation: Москва PostPosted: Thu Apr 16, 2015 04:45
    —
Сперва см. в ЛС.

hjiapex wrote:
передвинул скрипт на кнопку на панели быстрого доступа
Мне такая панель неизвестна. Скрипт можно перетянуть в пустую область панели инструментов либо с зажатым шифтом между её кнопками, где уже появится новая.

hjiapex wrote:
при запуске ничего не происходит
Значит, что-то делается не так. Когда окно касаемо буфера появилось, было подтверждение?

#43:  Author: hjiapex PostPosted: Thu Apr 16, 2015 04:48
    —
Flasher
Да, окно буфера есть, жму разрешить и ничего не происходит

#44:  Author: LonerDLocation: Макеевка PostPosted: Thu Apr 16, 2015 05:25
    —
Давно я начинал писать скрипт на AHK, постараюсь найти в ближайшие пару дней и доделать. Теоретически должно постабильней работать, чем все эти манипуляции с IE

#45:  Author: FlasherLocation: Москва PostPosted: Thu Apr 16, 2015 06:17
    —
Обновлённый вариант (по аналогии с приводимыми правками):
Code:
'=====================================================================
' Выделение в панелях одноимённых файлов и/или папок

' Параметры: "%P" "%T" <файлы/каталоги/всё: 1/2/3>
'======================= Путь к утилите TCFS2 ========================
TCFS2 = """%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe"""
'=====================================================================
With WScript.Arguments
  If .Count < 3 Then MsgBox "Укажите все требуемые параметры!", 48,_
  Space(13) & "Выделение элементов в панели" : WScript.Quit
  P = .Item(0) : T = .Item(1) : C = .Item(2)
End With : Set FSO = CreateObject("Scripting.FileSystemObject")
Select Case C : Case 1 Tp = 192 : Case 2 Tp = 160 : Case 3 Tp = 224 : End Select
Set Dict = CreateObject("Scripting.Dictionary")
Set SHA = CreateObject("Shell.Application")
Set Items = SHA.NameSpace(P).Items : Items.Filter Tp, "*"
For Each F in Items : Dict.Add CStr(F), "" : Next
Set Items = SHA.NameSpace(T).Items : Items.Filter Tp, "*"
For Each F in Items
  If Dict.Exists(CStr(F)) Then
    If Tp <> 192 And F.IsFolder Then F = F & "\"
    List = List & vbNewLine & F
  End If
Next

If List <> "" Then
  With CreateObject("WScript.Shell")
    TempFile = CreateObject("Shell.Application")._
    NameSpace(.ExpandEnvironmentStrings("%TEMP%")).Self.Path & "\" & FSO.GetTempName
    FSO.OpenTextFile(TempFile, 2, True, -1).Write List
    .Run "%comspec% /c clip < """ & TempFile & """",0,True
    .Run TCFS2 & " /ef msg($0B,0) tcm(2033,0) send({TAB})"&_
    " tcm(2033,0) send({TAB}) msg($0B,1) redraw()",,True
    .Run "%comspec% /c type|clip",0
  End With : FSO.DeleteFile TempFile, 1
End If
TCFS2Tools и IE не задействованы.

#46:  Author: AvadaLocation: Россия, Саратов PostPosted: Thu Apr 16, 2015 08:30
    —
hjiapex
Прочитайте внимательно правила форума — слишком много нарушений.
По очевидным причинам обсуждение полностью перенесено из "Общих вопросов" в подфорум по автоматизации и добавлено в уже существующую тему.
Оверквотинг на форуме запрещён. Научитесь обходиться без злоупотребления кнопкой "Цитата", есть другие методы. Всё избыточное цитирование из предыдущих постов удалено без всякого ущерба для связности обсуждения.
Исходный заголовок темы "Сравнить каталоги" был слишком общим.

#47:  Author: hjiapex PostPosted: Thu Apr 16, 2015 11:42
    —
Господи, ЗАРАБОТАЛО! БОЖЕ МОЙ! З А Р А Б О Т А Л О!!!

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

Рано радуюсь. Сравнивает то идет, если я просто открыл 2 каталога с файлами. А если я открываю единым списком файлов свой каталог(с подкаталогами), то скрипт эти списки не сравнивает...

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

Блин, наверно не понятно объяснил. При нажатии Shift+B открывается единый список файлов в данном каталоге (то есть подкаталоги тоже сканируются). Просто в моем случае одинаковые файлы находятся в разных папках. И таких папок около 40, по этому использовал сочетание Shift+B

#48:  Author: sa PostPosted: Thu Apr 16, 2015 17:36
    —
hjiapex wrote:
- Сравнить каталоги(она выделяла в активном каталоге файлы, которые НЕ повторяются по именам)

Прикол в том, что командой Сравнить каталоги
справка wrote:
Выделяются различающиеся файлы, причём только более новые. Файлы, отсутствующие в одном каталоге также выделяются в другом.
То есть имя у файлов может быть одно и тоже, а дата/время различаться и тогда один из них (более свежий) будет выделен, и он, кстати, может оказаться как в активном, так и в целевом каталоге.
Кроме того, возможна ситуация, когда имя у файлов может быть одно и тоже, дата/время тоже совпадает, а размер файлов разный и тогда будут выделены все такие файлы (как в активном, так и в целевом каталоге).

hjiapex wrote:
Как теперь мне реализовывать сложное копирование списками?
Понять бы, о чём речь…

#49:  Author: hjiapex PostPosted: Thu Apr 16, 2015 20:38
    —
Flasher
Как поправить скрипт, что бы он сравнивал файлы, даже если я нажал ctrl+b и вывел все файлы (из подкаталогов) списком?

#50:  Author: AvadaLocation: Россия, Саратов PostPosted: Thu Apr 16, 2015 21:19
    —
hjiapex
Об оверквотинге уже неоднократно говорили. Пока сделать выводы. Про ссылки на скрипты прямым текстом сказано в памятке к подфоруму. Замечание. Выше (после моей правки) показано, как подобные вещи должны выглядеть нормально. Хотя на самом деле в этом сообщении надобности вообще нет: про показ файлов без подкаталогов (только там Ctrl+B или Shift+Ctrl+B, а не Shift+B) сказано чуть выше, проблема вполне ясна с первого раза без повторов.

#51:  Author: hjiapex PostPosted: Thu Apr 16, 2015 22:48
    —
Avada
Если вы под оверквотингом подразумеваете "цитату" ок, больше не буду ее использовать. А цитировал я, в надежде, что человек, который писал скрипт, быстрее придет в тему и отпишется.

#52:  Author: FlasherLocation: Москва PostPosted: Fri Apr 17, 2015 00:16
    —
Поскольку такая задача требует дополнительных ресурсов, то предыдущий вариант я, пожалуй, оставлю.
Code:
'===================================================================
' Выделение в панелях одноимённых файлов и/или папок

' Файлы могут быть выделены в т.ч. в режиме без подкаталогов

' Параметры: "%P" "%T" <файлы/каталоги/всё: 1/2/3>

' Автор: Flasher ©
'====================== Путь к утилите TCFS2 =======================
TCFS2 = """%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe"""
'===================================================================
With WScript.Arguments
  If .Count < 3 Then MsgBox "Укажите все требуемые параметры!", 48,_
  Space(13) & "Выделение элементов в панели" : WScript.Quit
  P = .Item(0) : T = .Item(1) : C = .Item(2)
End With
If P = T Then CreateObject("WScript.Shell")._
Run TCFS2 & " /ef tcm(536)" : WScript.Quit
Select Case C : Case 1 Tp = 192 : Case 2 Tp = 160 : Case 3 Tp = 224 : End Select
Set FSO  = CreateObject("Scripting.FileSystemObject")
Set Dict = CreateObject("Scripting.Dictionary")
Set Col1 = CreateObject("Scripting.Dictionary")
Set Col2 = CreateObject("Scripting.Dictionary")
Set Col3 = CreateObject("Scripting.Dictionary")
Set ShA  = CreateObject("Shell.Application")
Recursion P : Test = 1 : Recursion T

If Col1.Count And Col2.Count Then
  With CreateObject("WScript.Shell")
    TempFile = ShA.NameSpace(.ExpandEnvironmentStrings("%TEMP%"))._
    Self.Path & "\" & FSO.GetTempName
    FSO.CreateTextFile(TempFile, 1, True).Write vbCr & Join(Col1.Keys, vbNewLine)
    .Run "%comspec% /c clip <""" & TempFile & """",0,True
    .Run TCFS2 & " /ef msg($0B,0) tcm(2033,0) send({TAB})",,True
    FSO.CreateTextFile(TempFile, 1, True).Write vbCr & Join(Col2.Keys, vbNewLine)
    .Run "%comspec% /c clip <""" & TempFile & """",0,True
    .Run TCFS2 & " /ef tcm(2033,0) send({TAB}) msg($0B,1) redraw()",,True
    .Run "%comspec% /c type|clip",0
  End With : FSO.DeleteFile TempFile, 1
End If

Sub Recursion(Fd)
  Set Items = ShA.NameSpace(Fd).Items : Items.Filter Tp, "*"
  If Test <> 1 Then
    For Each F in Items
      Dict.Add "\" & Mid(F.Path, Len(P) + 1) & "\", ""
    Next
  Else
    For Each F in Items
      Mass = Filter(Dict.Keys, "\" & F & "\")
      If Ubound(Mass) >= 0 Then
        S = "" : N = 2 : If C > 1 And F.IsFolder Then N = 1 : S = "\"
        If Not Col3.Exists(CStr(F)) Then
          For Each Fl in Mass : Col1.Add Mid(Fl, 2, Len(Fl) - N), "" : Next
          Col3.Add CStr(F), ""
        End If : Col2.Add Mid(F.Path, Len(T) + 1) & S, ""
      End If
    Next
  End If
  If C = 1 Then
    Items.Filter 160, "*"
    For Each F in Items
      If InStr(F.Type, "ZIP") = 0 Then Recursion F.Path
    Next
  End If
End Sub


hjiapex wrote:
А цитировал я, в надежде, что человек, который писал скрипт, быстрее придет в тему и отпишется.
Скорее наоборот. Меня раздражает избыточное цитирование. И повторное обращение в столь небольшом промежутке времени никак на моём внимании отразиться не может.
А тут Shift не помешало бы на Ctrl исправить.


Last edited by Flasher on Sat Apr 18, 2015 08:24; edited 4 times in total

#53:  Author: hjiapex PostPosted: Fri Apr 17, 2015 00:19
    —
Flasher
По поводу скрипта, новый должен уже и с ctrl+b сравнивать?

#54:  Author: FlasherLocation: Москва PostPosted: Fri Apr 17, 2015 00:22
    —
hjiapex
Читаем шапку. Иначе какой смысл было допиливать?

#55:  Author: hjiapex PostPosted: Fri Apr 17, 2015 00:27
    —
Flasher
Я в том смысле, что ошибку выдает. Скинул бы скрин, да форум не разрешает. В общем Код ошибки 800A01C9. Строка 49 Символ 9 Ошибка: Запись уже связана с элементом данного семейства. Я понял причину. Если у меня в окне, где показан список без подкаталогов (ctrl+b) повторяются файлы (к примеру в 2х разных папках одного каталога были одинаковые файлы, и в этом общем списке есть 2 файла с одинаковым именем), то программа выдает ошибку.


Last edited by hjiapex on Fri Apr 17, 2015 00:41; edited 1 time in total

#56:  Author: FlasherLocation: Москва PostPosted: Fri Apr 17, 2015 00:40
    —
А разве в памятке написано, что тут скриншоты нужно скидывать? Советую внимательно ознакомиться.

Касаемо ошибки. По идее быть не должно. Прошу скинуть список полных путей папки пассивной панели. Если он большой, то спрятать в спойлер (тег [cut]).

#57:  Author: hjiapex PostPosted: Fri Apr 17, 2015 00:43
    —
Flasher
Вы меня конечно простите, я пришел с обычных форумов, а тут слишком высокие требования к поведению на форуме.
По теме - я не понимаю, скинуть список полных путей папки пассивной панели? Можно для меня НЕ УМНОГО разжевать данное предложение?

#58:  Author: FlasherLocation: Москва PostPosted: Fri Apr 17, 2015 01:00
    —
hjiapex
Требования не столько высокие, сколько оптимальные для восприятия и поиска. Скопипастить сообщение в тег цитаты из окна куда быстрее, чем колупаться с хостингом картинок.
Как сюда скинуть список? Ну, это ОЧЕНЬ сложно. Smile В режиме без подкаталогов выделить всё по Ctrl+A, выполнить команду "Копировать полные имена файлов" и вставить сюда под спойлер.

#59:  Author: hjiapex PostPosted: Fri Apr 17, 2015 01:02
    —
 Hidden text


Last edited by hjiapex on Fri Apr 17, 2015 02:10; edited 1 time in total

#60:  Author: FlasherLocation: Москва PostPosted: Fri Apr 17, 2015 02:07
    —
Прошу отредактировать пост с заменой на отсортированный список по [=tc.Путь][=tc.Полное имя].

Last edited by Flasher on Fri Apr 17, 2015 02:24; edited 1 time in total

#61:  Author: LonerDLocation: Макеевка PostPosted: Fri Apr 17, 2015 02:12
    —
Flasher
А можно словами пояснить - что означает Select Case C ?
Понятно, что какие-то ограничения на длину, но не понял что именно.

#62:  Author: FlasherLocation: Москва PostPosted: Fri Apr 17, 2015 02:18
    —
 2LonerD

#63:  Author: hjiapex PostPosted: Fri Apr 17, 2015 02:23
    —
Flasher
Я отредактировал предыдущий пост.

#64:  Author: FlasherLocation: Москва PostPosted: Fri Apr 17, 2015 02:25
    —
hjiapex
Я там указал шаблон сортировки.

#65:  Author: hjiapex PostPosted: Fri Apr 17, 2015 02:37
    —
Flasher
Я тоталом стал пользоваться со вчерашнего дня. Как сделать подобную сортировку?

#66:  Author: FlasherLocation: Москва PostPosted: Fri Apr 17, 2015 02:53
    —
hjiapex
Shocked Ого, прогресс! Я когда начинал пользоваться WCMD, понятия не имел, что такое скрипты и т.п. Возможно, это вообще рекорд мира! Very Happy
Ладно, не надо, я уже в редакторе отсортировал.

hjiapex wrote:
Если у меня в окне, где показан список без подкаталогов (ctrl+b) повторяются файлы (к примеру в 2х разных папках одного каталога были одинаковые файлы, и в этом общем списке есть 2 файла с одинаковым именем), то программа выдает ошибку.
Только если эти одноимённые файлы имеют то же имя с элемент(ом/ами) в другой панели. И тут же нарисовалась проблема выделения нескольких одноимённых. Подумаю, как лучше решить.

Add: всё, можно проверять.

#67:  Author: sa PostPosted: Fri Apr 17, 2015 10:57
    —
hjiapex
Наряду с командами сравнения каталогов в тотале имеется команда "Синхронизировать каталоги", которая позволяет
справка wrote:
сравнить между собой два каталога, включая их подкаталоги, и затем скопировать различающиеся файлы в каталог назначения или в любой другой каталог.

С её помощью можно скопировать также и совпадающие по имени файлы.

#68:  Author: FlasherLocation: Москва PostPosted: Fri Apr 17, 2015 11:58
    —
hjiapex
Кое-что ещё подкорректировал. Вроде теперь нигде не сбоит.

#69:  Author: hjiapex PostPosted: Fri Apr 17, 2015 19:05
    —
sa
Синхронизация каталогов тестилась мною от и до, и нужного результата не получилось, не хочу рассказывать, что выдает подобный способ.


Flasher
Теперь вроде действительно все работает! Боюсь, Вас хватит удар, если я попрошу объяснить логику скрипта построчно)) Я к тому, что как Вы уже неоднократно поняли, что я полный ноль в TC и скриптах уж тем более, может чему научусь))

#70:  Author: AvadaLocation: Россия, Саратов PostPosted: Fri Apr 17, 2015 19:46
    —
hjiapex
Для пользования запрошенным скриптом понимать его логику (тем более — построчно) нет, уверяю, ни малейшей необходимости. А писать скрипты учатся не так.
Кроме того полагаю, что синхронизация (с оговоркой, что ей надо уметь пользоваться) вполне способна дать нужный результат. Впрочем, это за рамками данной темы и данного подфорума.

#71:  Author: LonerDLocation: Макеевка PostPosted: Fri Apr 17, 2015 20:55
    —
Avada wrote:
А писать скрипты учатся не так.

А я так начинал Embarassed - разбирал построчно чужие скрипты, чтобы понять пошаговый алгоритм действий автора, а потом уже вникал в сам синтаксис языка... Так и недоучился (полноценно понять алгоритм предложенного скрипта пока не могу), но нахватался немало для самостоятельного редактирования и даже написания собственных простеньких скриптов.

#72:  Author: FlasherLocation: Москва PostPosted: Fri Apr 17, 2015 23:00
    —
hjiapex wrote:
Теперь вроде действительно все работает!
Осталось написать волшебное слово. Wink

hjiapex wrote:
Вас хватит удар, если я попрошу объяснить логику скрипта построчно)) Я к тому, что как Вы уже неоднократно поняли, что я полный ноль в TC и скриптах уж тем более, может чему научусь))
Меня уже чуть Кондратий не хватил, когда я узнал про "ТС со вчерашнего дня". Smile Стремление к знаниям это, конечно, здорово, но в данном случае сбухты-барахты я бы так рьяно в бой не рвался. Сперва нужно с азами ТС более-менее разобраться, тут ждёт много всего интересного, а потом уже по-тихоньку переходить к данной части Мерлезонского балета. И лучше, как правильно отмечено, начинать не с попыток прочтения не самого простого кода (иначе они так попытками и останутся), а с изучения литературы и статей для начинающих. Сборником могу поделиться в PM.

 2LonerD

#73:  Author: LonerDLocation: Макеевка PostPosted: Sat Apr 18, 2015 21:35
    —
Flasher
Круть. У меня скрипт не отработал (ничего не выделил), несколько раз запустил, отложил, мол потом разберусь... Через шесть часов (!!!) запущенные копии скрипта выдали ошибку (оказывается, они в памяти сидели):
Liner 43
Char 3
Object required: 'Sha.NameSpace(...)'
Code 800A01A8
Very Happy

#74:  Author: FlasherLocation: Москва PostPosted: Sat Apr 18, 2015 23:16
    —
LonerD
На очень большой папке проверялось или в корне диска? Если да, то там рекурсия, и понятно, что на огромных списках это будет не быстро. Но 6 часов даже из корня - это слишком. Разве что дело в запущенности нескольких копий. Скрипт с единицей в 3-м параметре больше предназначен для режима без подкаталогов, в ином случае лучше использовать предыдущий вариант.
По части выданной ошибки - скрипт проверялся в последней редакции?

#75:  Author: LonerDLocation: Макеевка PostPosted: Sun Apr 19, 2015 18:11
    —
Flasher
Quote:
На очень большой папке проверялось или в корне диска?

На корне, наверное.
Сейчас проверил - на корне не отрабатывает (висит в процессах).
Да, в последней редакции.

#76:  Author: FlasherLocation: Москва PostPosted: Sun Apr 19, 2015 18:59
    —
LonerD wrote:
Сейчас проверил - на корне не отрабатывает (висит в процессах).
Он как раз отрабатывает, а не просто висит. Сравнивать только файлы в корнях - это для чего? Неужели ты отображаешь файлы без подкаталогов в корне?

#77:  Author: hjiapex PostPosted: Tue Apr 21, 2015 14:46
    —
Тут еще одна проблема возникла. Почему то на WinХР скрипт не работает, при использовании ничего не происходит.

#78:  Author: FlasherLocation: Москва PostPosted: Tue Apr 21, 2015 14:52
    —
Она не возникла. Я знал про неё. Mr. Green
Ссылка здесь уже приводилась.

#79:  Author: hjiapex PostPosted: Tue Apr 21, 2015 15:13
    —
Ссылочка битая похоже, можно перезалить clip?

#80:  Author: FlasherLocation: Москва PostPosted: Tue Apr 21, 2015 15:35
    —
На младших версиях в папке system32 лежит.

#81:  Author: hjiapex PostPosted: Wed Apr 22, 2015 15:40
    —
Если вы имеете в виду windows/system32 то в моей ХП такого файла нет (clip.exe)

#82:  Author: FlasherLocation: Москва PostPosted: Wed Apr 22, 2015 15:43
    —
hjiapex
Слово "младших" ни о чём не говорит?

#83:  Author: hjiapex PostPosted: Wed Apr 22, 2015 15:45
    —
Ну стал бы я такие вопросы озвучивать, будь мне все понятно?! Че за издевательство то такое? Что трудного перезалить маленький файлик на любой обменник? Нет же нужно поиграть на струнах моего мозга. Или это неотъемлемое условие на этом форуме?

#84:  Author: FlasherLocation: Москва PostPosted: Wed Apr 22, 2015 15:56
    —
А в голову не приходит мысль, что кто-то сейчас тоже на XP, и у него при себе этого файлика нет? Струны нужно лучше натягивать. Wink
Младшие версии - все, что появились после XP - Vista, 7, 8, 10.
И не забываем про волшебное слово "google".

#85:  Author: Skif_off PostPosted: Wed Apr 22, 2015 20:24
    —
Flasher wrote:
Младшие версии - все, что появились после XP - Vista, 7, 8, 10.

Обычно младшие - это младшие по номеру, а не по возрасту Smile)
Ппц, я тут уже дистриб Win2000 начал расковыривать...

#86:  Author: hjiapex PostPosted: Wed Apr 22, 2015 23:15
    —
Просто уточню. Для ХП скрипт выглядит так? Что то мне подсказывает, что нет...

Code:
'=====================================================================
' Выделение в панелях одноимённых файлов и/или папок

' Параметры: "%P" "%T" <файлы/каталоги/всё: 1/2/3>
'======================= Путь к утилите TCFS2 ========================
TCFS2 = """%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe"""
Clip  = "%COMMANDER_PATH%\Utils\clip.exe"
'=====================================================================
With CreateObject("WScript.Shell")
  Clip = .ExpandEnvironmentStrings(Clip)
  TempFile = CreateObject("Shell.Application")._
  NameSpace(.ExpandEnvironmentStrings("%TEMP%")).Self.Path & "\" & FSO.GetTempName
  FSO.OpenTextFile(TempFile, 2, True, -1).Write List1
  .Run "%comspec% /c """"" & Clip & """ < """ & TempFile & """""", 0, True
  FSO.OpenTextFile(TempFile, 2, True, -1).Write List2
  .Run """" & TCFS2 & """ /ef msg($0B,0) tcm(2033,0) send({TAB})",,True
  .Run "%comspec% /c """"" & Clip & """ < """ & TempFile & """""", 0, True
  .Run """" & TCFS2 & """ /ef tcm(2033,0) send({TAB}) msg($0B,1) redraw()",,True
  .Run "cmd /c type|" & Clip,0
End With : FSO.DeleteFile TempFile, 1 : D.RemoveAll : G.RemoveAll : Set D = Nothing
Set G = Nothing : Set Items = Nothing : Set FSO = Nothing : WScript.Quit


И еще вопрос по поводу clip'a, что с ним делать? Просто скинуть в корень с программой? Или в настройках цвета и ИНИ файла тоже добавить по аналогии TCFS2?

#87:  Author: FlasherLocation: Москва PostPosted: Thu Apr 23, 2015 06:13
    —
hjiapex wrote:
Что то мне подсказывает, что нет...
Конечно, нет. Это только заменяемый кусок, но и в нём нужны небольшие правки в соответствии с данными в средней части исходника.
hjiapex wrote:
Просто скинуть в корень с программой?
Если его скинуть в system32, то исходник править вообще не нужно.

#88:  Author: hjiapex PostPosted: Thu Apr 23, 2015 09:49
    —
Flasher
То есть тем скриптом, который идет на семерку?

Если да, то вот я сижу у одного пользователя, скинул в windows/system32 clip.exe и при использовании ничего не происходит.

#89:  Author: AvadaLocation: Россия, Саратов PostPosted: Thu Apr 23, 2015 10:52
    —
hjiapex
Замечание за нарушение правил форума: необоснованное полное цитирование скриптов вместо ссылки на них приравнивается в оверквотингу. Научитесь нормально оформлять сообщения. Код заменён ссылкой.


Last edited by Avada on Thu Apr 23, 2015 13:11; edited 1 time in total

#90:  Author: sa PostPosted: Thu Apr 23, 2015 11:07
    —
hjiapex
Советую проверить строку с TCFS2:
TCFS2 = """%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe"""
Промелькнула строка, где вместо трёх кавычек использовалась одна.

#91:  Author: hjiapex PostPosted: Thu Apr 23, 2015 11:26
    —
sa
Вот тут говорится, что 9 строку НЕ править, а между 9 и 10 вставить путь к clip.exe
1) А что, clip.exe имеет 2 варианта под x86 и x64? Просто сейчас выдает ошибку, что clip.exe не является приложением Win32.

2) И нельзя ли сделать как нибудь, чтоб не копировать clip.exe в папку с виндой каждому пользователю (а у меня их около 80)? Как сделать, чтоб clip подтягивался с флешки?

#92:  Author: FlasherLocation: Москва PostPosted: Thu Apr 23, 2015 11:34
    —
hjiapex
Пока не нужно заморачиваться с переделкой кода.
clip.exe в XP, разумеется, должен быть 32-битный. А брали похоже его из Win7 x64, поэтому и не работает. Вот 32-битный вариант.

#93:  Author: hjiapex PostPosted: Thu Apr 23, 2015 11:51
    —
Flasher
Большое спасибо за clip x32!
Но теперь почему-то сравнивает только файлы, имеющие буквенное имя. Файлы с именем, состоящим из чисел, не выделяет.

#94:  Author: FlasherLocation: Москва PostPosted: Thu Apr 23, 2015 12:04
    —
hjiapex
Не понимаю почему. Надо будет посмотреть на XP.
Касаемо переносной версии. Между 10 и 11 строкой вставляем (с верным путем):
Code:
'======================= Путь к утилите clip =======================
Clip  = """%COMMANDER_PATH%\Utils\clip.exe"""

и
 это
меняем на
 это

#95:  Author: hjiapex PostPosted: Thu Apr 23, 2015 22:50
    —
Flasher
Сделал изменение в скрипте, как вы сказали (касаемо переносной версии). Теперь при его выполнении совсем ничего не происходит. Предыдущий хоть выделял файлы с буквенными именами Confused

#96:  Author: FlasherLocation: Москва PostPosted: Fri Apr 24, 2015 03:20
    —
hjiapex
Ремарка у меня в скобках соответствует действительности?

#97:  Author: hjiapex PostPosted: Fri Apr 24, 2015 09:37
    —
Flasher
Ну да, разумеется, путь прописан верно.

А по поводу сравнение файлов с числовыми именами что нибудь получилось?


Last edited by hjiapex on Fri Apr 24, 2015 11:08; edited 1 time in total

#98:  Author: FlasherLocation: Москва PostPosted: Fri Apr 24, 2015 11:07
    —
hjiapex
Проверил на XP, у меня всё работает.


Last edited by Flasher on Fri Apr 24, 2015 11:10; edited 1 time in total

#99:  Author: hjiapex PostPosted: Fri Apr 24, 2015 11:10
    —
Flasher
В чем же может быть проблема? Может сервис пак должен быть какой то особый? Или почему у меня выделяет только символьные имена файлов?

#100:  Author: FlasherLocation: Москва PostPosted: Fri Apr 24, 2015 11:14
    —
hjiapex
Прошу перечитать памятку на предмет возникновения ошибок. И далее продолжим.

#101:  Author: hjiapex PostPosted: Fri Apr 24, 2015 11:16
    —
Flasher
Памятку? То есть тему сначала перечитать? Или это где то на форуме зарыто?

#102:  Author: FlasherLocation: Москва PostPosted: Fri Apr 24, 2015 11:23
    —
hjiapex
Здрасьте. Confused

#103:  Author: hjiapex PostPosted: Fri Apr 24, 2015 11:29
    —
Да проделывал я такие вещи же. Ну еще раз попробую, как дома буду. Спасибо за терпение.

#104:  Author: FlasherLocation: Москва PostPosted: Fri Apr 24, 2015 11:34
    —
Какие такие вещи? Ещё раз:
Flasher wrote:
на предмет возникновения ошибок
Со слов "Если скрипт не работает!".

#105:  Author: LonerDLocation: Макеевка PostPosted: Tue Apr 28, 2015 05:44
    —
Flasher
Твой скрипт не может отличить файл от одноимённого каталога (если в имени каталога точка).
Это просто наблюдение, мне некритично исправление (свой вариант пиляю, к тому же твой скрипт всё-равно с корневыми каталогами не работает)

#106:  Author: FlasherLocation: Москва PostPosted: Tue Apr 28, 2015 09:19
    —
LonerD wrote:
Твой скрипт не может отличить файл от одноимённого каталога (если в имени каталога точка).
Только ты забыл написать, что последний параметр - 3. Wink Посмотрю как мягче исправить.

LonerD wrote:
к тому же твой скрипт всё-равно с корневыми каталогами не работает
К тому же ты не ответил на мой вопрос.

#107:  Author: LonerDLocation: Макеевка PostPosted: Tue Apr 28, 2015 14:31
    —
Flasher wrote:
Только ты забыл написать, что последний параметр - 3.

Да, начинал ведь писать сообщение и упомянул об этом, потом что-то сбилось (то ли страницу закрыл), и когда снова начал печатать - забыл.

LonerD wrote:
Сравнивать только файлы в корнях - это для чего?

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

#108:  Author: FlasherLocation: Москва PostPosted: Tue Apr 28, 2015 14:37
    —
А зачем ты вырвал фразу из контекста? Там два вопроса в одном флаконе.
А про большие структуры было отвечено:
Flasher wrote:
Скрипт с единицей в 3-м параметре больше предназначен для режима без подкаталогов, в ином случае лучше использовать предыдущий вариант.

#109:  Author: LonerDLocation: Макеевка PostPosted: Tue Apr 28, 2015 17:56
    —
Flasher wrote:
А зачем ты вырвал фразу из контекста? Там два вопроса в одном флаконе.

Потому, что вопрос звучал то ли как риторический, то ли как не имеющий отношения к скрипту. Разные люди могут отображать файлы по-разному, и с каталогами, и без каталогов. Потому не суть важно как именно это делаю я.
Flasher wrote:
Неужели ты отображаешь файлы без подкаталогов в корне?

Нет, у меня вроде насколько помню никогда надобности не возникало. Скрипт в таких условиях тоже не проверял.

Flasher wrote:
А про большие структуры было отвечено:
Flasher wrote:
Скрипт с единицей в 3-м параметре больше предназначен для режима без подкаталогов, в ином случае лучше использовать предыдущий вариант.

Да, я видел и понял. Пользователь должен держать в голове - "Я хочу сравнить файлы. Нужно воспользоваться вот этим скриптом (повешенным на кнопку). Стоп, в одной панели в одной или обеих панелях у меня открыт корень диска, значит я должен пользоваться другим скриптом..."
Меня такая логика не устраивает, но изменять логику работы скрипта лично для меня - не прошу. Так как чувствую, что хватает знаний для самостоятельной реализации - делаю свой вариант.


Last edited by LonerD on Fri May 01, 2015 20:12; edited 1 time in total

#110:  Author: FlasherLocation: Москва PostPosted: Tue Apr 28, 2015 18:02
    —
LonerD wrote:
Потому, что вопрос звучал то ли как риторический, то ли как не имеющий отношения к скрипту.
С чего это ты так решил? Very Happy
LonerD wrote:
Разные люди могут отображать файлы по-разному, и с каталогами, и без каталогов. Потому не суть важно как именно это делаю я.
Вопрос режима без подкаталогов не ты поставил, поэтому резонно было спросить именно у тебя об этом.
LonerD wrote:
Стоп, в одной панели у меня открыт корень диска, значит я должен пользоваться другим скриптом..."
А почему только в одной?
LonerD wrote:
лично для меня
Можно и не лично для тебя. Можно и для себя и прежде всего для того, кто поднял тему и кому с этой проблемой ещё предстоит столкнуться.

#111:  Author: LonerDLocation: Макеевка PostPosted: Sat May 02, 2015 05:19
    —
Давным-давно я был инициатором идеи подобного скрипта.
Наконец-то, сделал свой вариант сравнения файлов и каталогов в панелях по именам на AutoHotkey. Very Happy
Теоретически скрипт должен работать в разных условиях, включая корень диска, результаты поиска, вид без каталогов, архивы...
Из-за ограничений Тотала не работает в результатах поиска внутри архивов и в режиме просмотра миниатюр.
Можно сравнивать только файлы, только каталоги или всё вместе (если не задан параметр - сравнивается всё).
Если у файла и каталога одно имя - они не выделяются (не считаются равными).
Если в панели несколько файлов с одним и тем же именем (например, при поиске или в виде без каталогов) - выделяются все.

Code:
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Total Commander DreamLair
; Script: Selection the same name files and/or dirs in the panels
; Скрипт: Виділення в панелях однойменних файлів та/або каталогів
; Скрипт: Выделение в панелях одноимённых файлов и/или каталогов
; Version: 1.0 (2015.05.02)
; Author: LonerD DreamLair.Net
; Made in Donetsk People's Republic
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Parameter:
;    1) Selection mode:
;       1 - all (default); 2 - only files; 3 - only dirs
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Параметр:
;    1) Метод виділення:
;       1 - все (за замовчуванням); 2 - тільки файли; 3 - тільки каталоги
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Параметр:
;    1) Метод выделения:
;       1 - всё (по умолчанию); 2 - только файлы; 3 - только каталоги
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#NoEnv
#NoTrayIcon
#MaxMem 1024
#SingleInstance force
SetBatchLines, -1

Mode = %1%
If Mode not in 1,2,3
  Mode = 1

If not ( WinExist("ahk_class TTOTAL_CMD") || WinActive("ahk_class TTOTAL_CMD") )
  ExitApp

ClipSaved := ClipboardAll
Clipboard := ""

WinGet, hw_TTOTAL_CMD, ID, A
DllCall("LockWindowUpdate", "uint", hw_TTOTAL_CMD)
ControlGetFocus, aControl, % "ahk_id " hw_TTOTAL_CMD
PathA := TC_SendData("SP")

SendMessage, 0x433, 524,,, % "ahk_id " hw_TTOTAL_CMD
SendMessage, 0x433, 330 . Mode,,, % "ahk_id " hw_TTOTAL_CMD
SelItems := TC_Command("0x190", aControl, 0, 0)
if ( SelItems = 0 )
  Goto, Exit

SendMessage, 0x433, 2017,,, % "ahk_id " hw_TTOTAL_CMD
FilesA := Clipboard
SendMessage, 0x433, 2018,,, % "ahk_id " hw_TTOTAL_CMD
FileListA := Clipboard

SendMessage, 0x433, 4001,,, % "ahk_id " hw_TTOTAL_CMD
ControlGetFocus, xControl, % "ahk_id " hw_TTOTAL_CMD
B_Panel := xControl = aControl ? 2 : 1
A_Panel := B_Panel = 1 ? 2 : 1

SendMessage, 0x433, 400 . B_Panel,,, % "ahk_id " hw_TTOTAL_CMD

ControlGetFocus, bControl, % "ahk_id " hw_TTOTAL_CMD
PathB := TC_SendData("SP")
SendMessage, 0x433, 524,,, % "ahk_id " hw_TTOTAL_CMD
SendMessage, 0x433, 330 . Mode,,, % "ahk_id " hw_TTOTAL_CMD

if ( PathA = PathB )
  Goto, Exit

SelItems := TC_Command("0x190", bControl, 0, 0)
if ( SelItems = 0 )
  Goto, NoSelection

SendMessage, 0x433, 2017,,, % "ahk_id " hw_TTOTAL_CMD
FilesB := Clipboard
SendMessage, 0x433, 2018,,, % "ahk_id " hw_TTOTAL_CMD
FileListB := Clipboard

FileListSel := ""
Loop, Parse, FilesA, `n, `r
{
  CurrentFile := A_LoopField
  Loop, Parse, FilesB, `n, `r
  {
    if ( CurrentFile = A_LoopField )
      FileListSel := FileListSel A_LoopField "`r`n"
  }
}

if ( FileListSel = "" )
  Goto, NoSelection

FileListSelA := ""
FileListSelB := ""
FileListSelX := ""
FileListX := FileListB
Gosub, LoopFilelist
FileListSelB := FileListSelX
FileListX := FileListA
Gosub, LoopFilelist
FileListSelA := FileListSelX

StringReplace, FileListSelA, FileListSelA, % PathA, , All
StringReplace, FileListSelB, FileListSelB, % PathB, , All

Clipboard := FileListSelB
SendMessage, 0x433, 2033,,, % "ahk_id " hw_TTOTAL_CMD
SendMessage, 0x433, 400 . A_Panel,,, % "ahk_id " hw_TTOTAL_CMD
Clipboard := FileListSelA
SendMessage, 0x433, 2033,,, % "ahk_id " hw_TTOTAL_CMD

Exit:
Clipboard := ClipSaved
ClipSaved := ""
FileListA := ""
FileListB := ""
FileforSel := ""
FileListSelA := ""
FileListSelB := ""
FileListSelX := ""
DllCall("LockWindowUpdate", "uint", 0)
ExitApp

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LoopFilelist:
Loop, Parse, FileListSel, `n, `r
{
  FileforSel := A_LoopField
  FileLen := StrLen(FileforSel)
  if ( FileLen > 0 )
  {
    Loop, Parse, FileListX, `n, `r
    {
      StringLen := StrLen(A_LoopField)
      SlashSymbol := SubStr(A_LoopField, StringLen - FileLen, 1)
      StringRight, CurrentFile, A_LoopField, FileLen
      if (( StringLen - FileLen > 1 ) && ( SlashSymbol = "\" ) && ( CurrentFile = FileforSel ))
        FileListSelX := FileListSelX A_LoopField "`r`n"
    }
  }
}
Return
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NoSelection:
SendMessage, 0x433, 524,,, % "ahk_id " hw_TTOTAL_CMD
SendMessage, 0x433, 400 . A_Panel,,, % "ahk_id " hw_TTOTAL_CMD
SendMessage, 0x433, 524,,, % "ahk_id " hw_TTOTAL_CMD
Goto, Exit
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Доп. функция (автор я)
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TC_Command(TCmessage, aControl, Param1, Param2)
{
  global hw_TTOTAL_CMD
  SendMessage, % TCmessage, % Param1, % Param2, % aControl, % "ahk_id " hw_TTOTAL_CMD
  return ErrorLevel
}
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Доп. функция (автор artt)
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TC_SendData(Cmd, CmdType="", msg="", hwnd="")
{
  Critical
  global hw_TTOTAL_CMD
  Static om := OnMessage(0x4a, "TC_SendData"), TC_ReceiveDataValue := "", TC_DataReceived := ""

  If ( (msg=0x4A) and (hwnd=A_ScriptHwnd) )
    Exit ( TC_ReceiveDataValue := StrGet(NumGet(CmdType + A_PtrSize * 2)), TC_DataReceived := "1" )

  VarSetCapacity(CopyDataStruct, A_PtrSize * 3), TC_ReceiveDataValue := 1, TC_DataReceived := ""
  If CmdType in LR,ST
  DirType := CmdType, CmdType := "CD"
  else if ( CmdType = "" )
    CmdType := ( A_IsUnicode ? "GW" : "GA" ), TC_ReceiveDataValue := ""

  If( A_IsUnicode )
  {
    VarSetCapacity(cmdA, StrPut(cmd, "cp0"), 0)
    Loop, % StrLen(cmd)
      NumPut( Asc(SubStr(cmd, A_Index, 1)), cmdA, A_Index - 1, "Char" )
  }
  NumPut( Asc(SubStr(CmdType, 1, 1)) + 256 * Asc(SubStr(CmdType, 2, 1)), CopyDataStruct, 0 )
  NumPut( StrLen(cmd) + (CmdType = "CD" ? 5 : 0), CopyDataStruct, A_PtrSize )
  NumPut( (A_IsUnicode ? &cmdA : &cmd), CopyDataStruct, A_PtrSize * 2 )
  Loop, % ( CmdType=="CD" ? 2 : 0 )
    NumPut( Asc(SubStr(DirType, A_Index, 1)), (A_IsUnicode ? cmdA : cmd), (StrLen(cmd) + A_Index), "Char" )

  SendMessage, 0x4A, %A_ScriptHwnd%, &CopyDataStruct,, % "ahk_id " hw_TTOTAL_CMD
;  SendMessage, 0x4A, %A_ScriptHwnd%, &CopyDataStruct,, ahk_class TTOTAL_CMD

  While ( TC_ReceiveDataValue = "" )
  {
    IfEqual, TC_DataReceived,    1, Break
    IfGreaterOrEqual, A_Index, 500, Break
    Sleep, 10
  }
  Return TC_ReceiveDataValue
}
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#112:  Author: ingerard PostPosted: Wed Dec 06, 2017 01:05
    —
Flasher
Я тут немного ваш скрипт переделал под другую задачу, на удивление работает, но хотелось бы чтоб работало без затрагивания буфера. И еще не работает параметр 3 - только папки.

Code:
'===================== VBS ======================
' Выделение подобных элементов на другой панели

' Условия: 1) требуется компонент TCScript.dll;
'          2) имена папок должны иметь \ на конце

' Параметры: "%T" <выдел. всё/файлы/папки: 1/2/3>
'================================================
Set R = New RegExp : R.Global = True : P = WSH.Arguments(0)
With CreateObject("TCScript.Helper")
  .NoArrayReturn = True : .LockTC True
  .Pause = 0 : .Wait = True : Clip = .GetSrcSelectedFiles(0) : .Sleep 20
  R.Pattern = "^[\r\n]+|[\r\n]+$|\r?\n(?=(\r?\n)+)"
  RClip = Replace(R.Replace(Clip, ""), vbNewline, "|")
  R.Pattern = "([.;$+^\\\(\)\{\[])" : R.MultiLine = True
  R.Pattern = "(^|\r\n)([^\r\n]+\\(" & R.Replace(RClip, "\$1") & "))$"
  .NoArrayReturn = True : .LockTC True : .SendCommand 4006, True
  .SendCommand 3300 + WSH.Arguments(1), True
  Sel = .GetSrcSelectedFiles(1) : .Sleep 20
  For Each Path in R.Execute(Sel)
    List = List & Path.Value
  Next : .SendCommand 524, True
  If P <> "" Then List = Replace(List, P, "") : .Sleep 20
  .SetTextToClip List : .SendCommand 2033, True : .SendCommand 4006, True
  .LockTC False
End With


 !  Avada:
Отсюда и далее цепочка сообщений, находившаяся ранее в этой теме, перенесена в более адекватное место.

#113:  Author: FlasherLocation: Москва PostPosted: Wed Dec 06, 2017 01:43
    —
ingerard
Я не понял по названию в шапке, что должен делать скрипт, и как это относится к сабжу. Подобные элементы по отношению к чему? Не про эту тему речь?

#114:  Author: ingerard PostPosted: Wed Dec 06, 2017 11:31
    —
Flasher
Получилось сделать самому, в шапке уточнил для чего это нужно, надеюсь что объяснил доступно Smile Не знаю только насчет оптимизации, работает вроде быстро.

Code:
'===================== VBS ======================
' Выделение в противоположной панели похожих по
' названию файлов/папок, выделенных на текущей.

' Условия: 1) требуется компонент TCScript.dll;
'          2) имена папок должны иметь \ на конце

' Параметры: "%T" <выдел. всё/файлы/папки: 1/2/3>
'================================================
Set R = New RegExp : R.Global = True : P = WSH.Arguments(0)
With CreateObject("TCScript.Helper")
  .NoArrayReturn = True : .LockTC True
  T = .GetTextFromClip
  .Pause = 0 : .Wait = True : Clip = .GetSrcSelectedFiles(0) : .Sleep 20
  .SetTextToClip Clip : .SendCommand 2033, True
  R.Pattern = "^[\r\n]+|[\r\n]+$|\r?\n(?=(\r?\n)+)"
  RClip = Replace(R.Replace(Clip, ""), vbNewline, "|")
  R.Pattern = "([.;$+^\\\(\)\{\[])" : R.MultiLine = True
  R.Pattern = "(^|\r\n)([^\r\n]+\\(" & R.Replace(RClip, "\$1") & "))$"
  .NoArrayReturn = True : .LockTC True : .SendCommand 4006, True
  .SendCommand 3300 + WSH.Arguments(1), True
  Sel = .GetSrcSelectedFiles(1) : .Sleep 20
  For Each Path in R.Execute(Sel)
    List = List & Path.Value
  Next : .SendCommand 524, True
  If P <> "" Then List = Replace(List, P, "") : .Sleep 20
  .SetTextToClip List : .SendCommand 2033, True : .SendCommand 4006, True
  .SetTextToClip(T)
  .LockTC False
End With


Quote:
Не про эту тему речь?

Похоже на то, я просто искал по слову "Выделение". Этот скрипт у меня просит разрешение IE и какой-то он сильно громадской. А этот выдает ошибку "Не найден путь, строка 6, символ 3"

#115:  Author: FlasherLocation: Москва PostPosted: Wed Dec 06, 2017 11:54
    —
ingerard
Не, это никуда не годится. Тут такой набор манипуляций совершенно не требуется. Всё куда проще:
Code:
'=========================== VBS ============================
' Выделение в другой панели одноимённых с выбранными объектов
' Условие: требуется компонент TCScript.dll
'============================================================
With CreateObject("TCScript.Helper")
  .Pause = 0 : .Wait = True : Clip = .GetTextFromClip
  .LockTC True : .NoArrayReturn = True: If .GetInfo("TP") = "" Then _
  .SetTextToClip .GetSrcSelectedFiles(1) Else _
  .SetTextToClip Replace(.GetSrcSelectedFiles(1), .GetInfo("SP"), "")
  .SendCommand 4006, True : .SendCommand 2033, True
  .SendCommand 4006, True : .LockTC False : .SetTextToClip Clip
End With
И это обсуждение точно не по теме.

Last edited by Flasher on Wed Dec 06, 2017 16:32; edited 7 times in total

#116:  Author: ingerard PostPosted: Wed Dec 06, 2017 11:59
    —
Flasher
Но мне нужно вернуть фокус панели и если ни один элемент не выделен, то выделяется элемент под курсором. А в какую тему если что переходить для дальнейшего обсуждение если чего?

#117:  Author: FlasherLocation: Москва PostPosted: Wed Dec 06, 2017 12:09
    —
ingerard
Возврат добавил. Но насчёт элемента под курсором не вижу ничего криминального. Объект выбран (скрипт так и назван), кнопка нажата. Что в этом плохого? Это наоборот удобно, когда, например, нужно сравнить 2 файла по содержимому.

Переходить уже нет смысла. Теперь придётся ждать модератора для переноса.

#118:  Author: ingerard PostPosted: Wed Dec 06, 2017 12:19
    —
Quote:
Это наоборот удобно, когда, например, нужно сравнить 2 файла по содержимому.

Как раз для таких целей и нужно, мелочное дополнение которое иногда нужно. Достаточно добавить?
.SetTextToClip .GetSrcSelectedFiles(0) : .SendCommand 2033, True

p.s. Код не работает в режиме Branch, а тот что я подправил работает.


Last edited by ingerard on Wed Dec 06, 2017 12:28; edited 3 times in total

#119:  Author: FlasherLocation: Москва PostPosted: Wed Dec 06, 2017 12:26
    —
ingerard wrote:
Как раз для таких целей и нужно
В этом есть противоречие. Если бы было нужно, то зачем ограничивать поведение?

Указанная добавка вообще не годится. Для этого несколько иные механизмы нужны, но они есть в той версии Хелпера, которую я по некоторым причинам ещё не выкладывал.

Вообще применять подобную вещь в режиме DirBranch как минимум странно, потому как этот режим для восстановления выделения предполагает совпадение относительности путей в обеих панелях, а такая потребность на практике кажется мне несколько сомнительной и задействовать добавочный код в ущерб скорости я бы не советовал.
Но, если очень надо, то я подскажу, что нужно отредактировать.

#120:  Author: ingerard PostPosted: Wed Dec 06, 2017 12:52
    —
Flasher wrote:
Но, если очень надо, то я подскажу, что нужно отредактировать.

Очень надо Smile Так же в режиме Branch если найдет схожие по названию файлы+расширение, то отмечать все

#121:  Author: FlasherLocation: Москва PostPosted: Wed Dec 06, 2017 13:01
    —
ingerard
Надо-то зачем? + На вопрос ответ будет?

#122:  Author: ingerard PostPosted: Wed Dec 06, 2017 13:10
    —
Quote:
Если бы было нужно, то зачем ограничивать поведение?

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

#123:  Author: FlasherLocation: Москва PostPosted: Wed Dec 06, 2017 13:18
    —
ingerard
Ну, вот и славно. Так что по совпадению относительности? Можно хотя бы один пример такой потребности?

#124:  Author: ingerard PostPosted: Wed Dec 06, 2017 13:46
    —
Ну потребность в этом же скрипте есть? А это почти тоже самое, но имена файлов не из буфера берутся, а из выделенных файлов на панели. Если в режиме Branch находит много схожих файлов, то их тоже отмечать, даже если пути разные.

#125:  Author: FlasherLocation: Москва PostPosted: Wed Dec 06, 2017 14:14
    —
Это не то же самое. Там речь идёт о восстановлении выделения из буфера. А тут о выделении в обеих панелях. Ладно, внёс правку.

#126:  Author: ingerard PostPosted: Wed Dec 06, 2017 15:33
    —
Flasher
Пока что все отлично работает, спасибо.

#127:  Author: FlasherLocation: Москва PostPosted: Wed Dec 06, 2017 16:34
    —
ingerard
Пож-та. В 7 строке S на T заменил. Для результатов поиска нужно смотреть на получатель, а не источник.

#128:  Author: LonerDLocation: Макеевка PostPosted: Mon Sep 24, 2018 04:52
    —
Спустя три года обновил свой вариант на AHK.
Ссылка на полную версию скрипта.
Данная версия скрипта работает только под TC 9.0 и более новыми версиями. Благодаря новым возможностям Тотала удалось значительно сократить и оптимизировать код.

 Скрипт


CaptainFlint:
Спрятал длинный код.



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