Сравнение файлов в панелях по именам

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

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

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

Сообщение Flasher »

LonerD писал(а):Твой скрипт не может отличить файл от одноимённого каталога (если в имени каталога точка).
Только ты забыл написать, что последний параметр - 3. :wink: Посмотрю как мягче исправить.
LonerD писал(а):к тому же твой скрипт всё-равно с корневыми каталогами не работает
К тому же ты не ответил на мой вопрос.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Flasher писал(а):Только ты забыл написать, что последний параметр - 3.
Да, начинал ведь писать сообщение и упомянул об этом, потом что-то сбилось (то ли страницу закрыл), и когда снова начал печатать - забыл.
LonerD писал(а):Сравнивать только файлы в корнях - это для чего?
Для того же, что и в каталогах - узнать одинаковые ли файлы или разные (по именам). К примеру, у меня в корнях дисков часто файлы скапливаются, например с которыми работаю или скачанные. Потом их частично перемещаю/копирую в подкаталоги, и актуально знать какие файлы уже скопировал и можно удалять из корня диска... По сути не делаю различия между каталогом и корнем в процессе работы за компьютером.
Windows 11 | TC DreamLair eternal pre-α
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

А зачем ты вырвал фразу из контекста? Там два вопроса в одном флаконе.
А про большие структуры было отвечено:
Flasher писал(а):Скрипт с единицей в 3-м параметре больше предназначен для режима без подкаталогов, в ином случае лучше использовать предыдущий вариант.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Flasher писал(а):А зачем ты вырвал фразу из контекста? Там два вопроса в одном флаконе.
Потому, что вопрос звучал то ли как риторический, то ли как не имеющий отношения к скрипту. Разные люди могут отображать файлы по-разному, и с каталогами, и без каталогов. Потому не суть важно как именно это делаю я.
Flasher писал(а):Неужели ты отображаешь файлы без подкаталогов в корне?
Нет, у меня вроде насколько помню никогда надобности не возникало. Скрипт в таких условиях тоже не проверял.
Flasher писал(а):А про большие структуры было отвечено:
Flasher писал(а):Скрипт с единицей в 3-м параметре больше предназначен для режима без подкаталогов, в ином случае лучше использовать предыдущий вариант.
Да, я видел и понял. Пользователь должен держать в голове - "Я хочу сравнить файлы. Нужно воспользоваться вот этим скриптом (повешенным на кнопку). Стоп, [s]в одной панели[/s] в одной или обеих панелях у меня открыт корень диска, значит я должен пользоваться другим скриптом..."
Меня такая логика не устраивает, но изменять логику работы скрипта лично для меня - не прошу. Так как чувствую, что хватает знаний для самостоятельной реализации - делаю свой вариант.
Последний раз редактировалось LonerD Пт май 01, 2015 19:12, всего редактировалось 1 раз.
Windows 11 | TC DreamLair eternal pre-α
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

LonerD писал(а):Потому, что вопрос звучал то ли как риторический, то ли как не имеющий отношения к скрипту.
С чего это ты так решил? :D
LonerD писал(а):Разные люди могут отображать файлы по-разному, и с каталогами, и без каталогов. Потому не суть важно как именно это делаю я.
Вопрос режима без подкаталогов не ты поставил, поэтому резонно было спросить именно у тебя об этом.
LonerD писал(а):Стоп, в одной панели у меня открыт корень диска, значит я должен пользоваться другим скриптом..."
А почему только в одной?
LonerD писал(а):лично для меня
Можно и не лично для тебя. Можно и для себя и прежде всего для того, кто поднял тему и кому с этой проблемой ещё предстоит столкнуться.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Давным-давно я был инициатором идеи подобного скрипта.
Наконец-то, сделал свой вариант сравнения файлов и каталогов в панелях по именам на AutoHotkey. :D
Теоретически скрипт должен работать в разных условиях, включая корень диска, результаты поиска, вид без каталогов, архивы...
Из-за ограничений Тотала не работает в результатах поиска внутри архивов и в режиме просмотра миниатюр.
Можно сравнивать только файлы, только каталоги или всё вместе (если не задан параметр - сравнивается всё).
Если у файла и каталога одно имя - они не выделяются (не считаются равными).
Если в панели несколько файлов с одним и тем же именем (например, при поиске или в виде без каталогов) - выделяются все.

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

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; 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
}
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Windows 11 | TC DreamLair eternal pre-α
ingerard
Сообщения: 128
Зарегистрирован: Вс дек 04, 2016 21:51

Сообщение ingerard »

Flasher
Я тут немного ваш скрипт переделал под другую задачу, на удивление работает, но хотелось бы чтоб работало без затрагивания буфера. И еще не работает параметр 3 - только папки.

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

'===================== 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
[mod="Avada"]Отсюда и далее цепочка сообщений, находившаяся ранее в этой теме, перенесена в более адекватное место.[/mod]
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

ingerard
Я не понял по названию в шапке, что должен делать скрипт, и как это относится к сабжу. Подобные элементы по отношению к чему? Не про эту тему речь?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
ingerard
Сообщения: 128
Зарегистрирован: Вс дек 04, 2016 21:51

Сообщение ingerard »

Flasher
Получилось сделать самому, в шапке уточнил для чего это нужно, надеюсь что объяснил доступно :) Не знаю только насчет оптимизации, работает вроде быстро.

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

'===================== 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
Не про эту тему речь?
Похоже на то, я просто искал по слову "Выделение". Этот скрипт у меня просит разрешение IE и какой-то он сильно громадской. А этот выдает ошибку "Не найден путь, строка 6, символ 3"
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

ingerard
Не, это никуда не годится. Тут такой набор манипуляций совершенно не требуется. Всё куда проще:

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

'=========================== 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
И это обсуждение точно не по теме.
Последний раз редактировалось Flasher Ср дек 06, 2017 15:32, всего редактировалось 7 раз.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
ingerard
Сообщения: 128
Зарегистрирован: Вс дек 04, 2016 21:51

Сообщение ingerard »

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

Сообщение Flasher »

ingerard
Возврат добавил. Но насчёт элемента под курсором не вижу ничего криминального. Объект выбран (скрипт так и назван), кнопка нажата. Что в этом плохого? Это наоборот удобно, когда, например, нужно сравнить 2 файла по содержимому.

Переходить уже нет смысла. Теперь придётся ждать модератора для переноса.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
ingerard
Сообщения: 128
Зарегистрирован: Вс дек 04, 2016 21:51

Сообщение ingerard »

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

p.s. Код не работает в режиме Branch, а тот что я подправил работает.
Последний раз редактировалось ingerard Ср дек 06, 2017 11:28, всего редактировалось 3 раза.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

ingerard писал(а):Как раз для таких целей и нужно
В этом есть противоречие. Если бы было нужно, то зачем ограничивать поведение?

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

Вообще применять подобную вещь в режиме DirBranch как минимум странно, потому как этот режим для восстановления выделения предполагает совпадение относительности путей в обеих панелях, а такая потребность на практике кажется мне несколько сомнительной и задействовать добавочный код в ущерб скорости я бы не советовал.
Но, если очень надо, то я подскажу, что нужно отредактировать.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
ingerard
Сообщения: 128
Зарегистрирован: Вс дек 04, 2016 21:51

Сообщение ingerard »

Flasher писал(а):Но, если очень надо, то я подскажу, что нужно отредактировать.
Очень надо :) Так же в режиме Branch если найдет схожие по названию файлы+расширение, то отмечать все
Ответить