Сравнить в панелях списки каталогов

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

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

Аватара пользователя
avyor
Сообщения: 8
Зарегистрирован: Вс авг 14, 2011 17:53
Откуда: Москва

Сравнить в панелях списки каталогов

Сообщение avyor »

Продолжение темы, начатой здесь http://forum.wincmd.ru/viewtopic.php?t=14077

Flasher

Сделал файл comparecatalogs.vbs с усечённым вариантом кода (только папки):

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

' Выделение  в панелях одноимённых, но разноразмерных папок 
' Необходима регистрация Script Helper ActiveX for TC 
' Параметр: "%P" "%T" 
'================================================== 
With CreateObject("Scripting.FileSystemObject") 
  Set P = .GetFolder(WScript.Arguments(0)) 
  Set T = .GetFolder(WScript.Arguments(1)) 
End With 
Set D = CreateObject("Scripting.Dictionary") 
Set G = CreateObject("Scripting.Dictionary") 

For Each F in P.SubFolders 
  D.Add F.Name, F.SIze 
Next 
For Each F in T.SubFolders 
  G.Add F.Name, F.SIze 
Next 
For Each F in D.Keys 
  If G.Exists(F) And D(F) <> G(F) Then S = S & vbnewline & F & "\" 
Next 

With CreateObject("TCScript.Helper") 
  T = .GetTextFromClip 
  .SetTextToClip(S) 
  .LockTC True 
  .SendCommand 4001 
  .SendCommand 2033 
  .SendCommand 4002 
  .SendCommand 2033 
  .LockTC False 
  .SetTextToClip(T) 
End With 

Wscript.Quit 
Затем сделал кнопку с ним с параметрами "%P %T". Последнюю версию Script Helper ActiveX for TC beta12 установил, рантаймы VB6 тоже.

Volniy писал:
регистрация ActiveX сервера всегда сопровождается записью в реестр, причем именно в HKLM
Запись в HKLM есть:
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{6ED70EDA-595D-4298-B417-250CCBA7FFDA}\LocalServer32]
@="H:\\Total Commander 7.5.6\\Plugins\\exe\\TCWSHelp.exe"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{6F7C65FD-C08B-4EBF-966E-E60F8EAA6E97}\1.0\0\win32]
@="H:\\Total Commander 7.5.6\\Plugins\\exe\\TCWSHelp.exe"

Но выдается сообщение об ошибке:
Сценарий: h:\Total Commander 7.5.6\scripts\comparecatalogs.vbs
Строка: 6
Символ: 3
Ошибка: Путь не найден
Код: 800А004С
Источник: Ошибка выполнения Microsoft VBScript
6-я строка:
Set P = .GetFolder(WScript.Arguments(0))
3-й символ - это "S".

Продублировал код в файле comparecatalogs.wsf и тоже сделал кнопку.
Теперь в сообщении об ошибке:
Сценарий: h:\Total Commander 7.5.6\scripts\comparecatalogs.wsf
Строка: 19
Символ: 29
Ошибка: Ожидается допустимое имя
Код: 8004000А
Источник: Windows Script Host
19-я строка:
If G.Exists(F) And D(F) <> G(F) Then S = S & vbnewline & F & "\"
29-й символ - это пробел.

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

Сообщение Flasher »

avyor писал(а):
' Параметр: "%P" "%T"
avyor писал(а):Затем сделал кнопку с ним с параметрами "%P? ?%T".
С учётом потребностей название топика должно быть таким:
"Сравнить в панелях списки каталогов"
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Чтобы принудительно не оказываться в итоге на правой панели:
1) тем, кто не опасается "нажимать" из скрипта клавишу TAB, можно заменить кусок кода (4 строки) между .LockTC True и .LockTC False на

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

  .SendCommand 2033
  .SendKeystroke "{TAB}"
  .SendCommand 2033
  .SendKeystroke "{TAB}"
2) пользователям утилиты TCFS2 (с модулем TCFS2Tools) можно заменить кусок кода (6 строк) между .SetTextToClip(S) и .SetTextToClip(T) на что-то вроде

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

  CreateObject("WScript.Shell").Exec("%COMMANDER_PATH%\Utils\TCFS2.exe /ef ""tcm(2033) tcm(4002) tcm(2033) tcm(4001), test(L_isActive) | tcm(2033) tcm(4001) tcm(2033) tcm(4002)""")
  Wscript.Sleep(50)
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

sa, помню с Tab-ом проблемы какие-то были, поэтому и остановился на командах.
А насчёт TCFS2 тогда уж и остальную портабельность с буфером допиливать:

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

With CreateObject("InternetExplorer.Application")
  .Navigate("about:blank")
  T = .Document.ParentWindow.ClipboardData.GetData("text")
  .Document.ParentWindow.ClipboardData.SetData "text", Mid(S,1)
  CreateObject("WScript.Shell").Exec"%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe /ef ""tcm(2033) tcm(4002) tcm(2033) tcm(4001), test(L_isActive) | tcm(2033) tcm(4001) tcm(2033) tcm(4002)"""
  Wscript.Sleep(50)
  .Document.ParentWindow.ClipboardData.SetData "text", Mid(T,1)
  .Quit
End With

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

Utils\TCFS2.exe
папка не пропущена?
Последний раз редактировалось Flasher Пт авг 19, 2011 15:10, всего редактировалось 2 раза.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Flasher писал(а):папка не пропущена?
Пока правил, чтобы "было как у всех", пропустил:

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

Utils\TCFS2\TCFS2.exe
Flasher писал(а):помню с Tab-ом проблемы какие-то были
Хорошо я не такой памятливый. :)
Аватара пользователя
avyor
Сообщения: 8
Зарегистрирован: Вс авг 14, 2011 17:53
Откуда: Москва

Сообщение avyor »

Flasher
Теперь заработало. Ещё раз спасибо!
С учётом потребностей название топика должно быть таким:
"Сравнить в панелях списки каталогов"
Да нет, это только для обкатки взял более простой вариант скрипта.

А теперь и полный вариант (сравнить и каталоги, и файлы) проверил.

Аналогично - сделал файл compareall.vbs, повесил на кнопку.
Тоже прекрасно работает.

Так что название темы поменяли зря.
работать будет медленно (циклы)
Для нескольких сотен папок (плюс файлов порядка сотни) - за 5-6 секунд :D
В отличие от пресловутой синхронизации, которая не закончилась и за полчаса и была мною прекращена принудительно (чтобы не мучалась :wink: ).

[mod="Avada"]Код заменён ссылкой.[/mod]
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

avyor писал(а):Да нет, это только для обкатки взял более простой вариант скрипта.
Для обкатки проще взять то, что уже есть без лишних телодвижений.
Копировать весь код, приведённый в другом топике, сюда не имело никакого смысла. У нас принято заменять его ссылкой.
avyor писал(а):Так что название темы поменяли зря.
Не зря, п.ч. дублирование никому не нужно. По проблеме со скриптом можно было ограничиться и исходной темой (достаточно было написать код ошибки).
avyor писал(а):Для нескольких сотен папок (плюс файлов порядка сотни) - за 5-6 секунд
Информация, после которой последовало "Ускорил ...", - неактуальна.
Единственное, что там стоило приписать - это сдвоенные циклы, от которых след простыл.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

avyor писал(а):В отличие от пресловутой синхронизации, которая не закончилась и за полчаса и была мною прекращена принудительно
Странно. Опция "по содержимому" точно не была включена?
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

avyor
Пара слов о "пресловутой синхронизации" и замечательном сравнении в панелях. Уже во всеоружии прогрессивных методик, с учётом возможностей новых скриптов, успешно решающих поставленную перед ними задачу.
Пример 1. Два каталога, содержащие энное число подкаталогов и файлов. Всё различие между ними, предположим, в одном файле на седьмом уровне вложенности. Я так полагаю, что для пользы дела надо знать не только сам факт того, что что-то отличается, но и что именно отличается, нет? Сколько времени и лишних телодвижений потребует многократное сравнение по мере опускания по уровням, пока мы не найдём подкаталог, содержащий искомое несовпадение? (Про возможность привлечь показ файлов без подкаталогов я знаю, но мы сейчас именно работу с каталогами обсуждаем.) И сколько эта же процедура, выполняемая один раз и дающая полную наглядность результата, займёт в инструменте синхронизации?
Пример 2. В простейшем случае имеем два каталога, в каждом — по одноимённому подкаталогу, а в каждом из них — по одному разному файлу одинакового размера. Скрипт честно отработает и не выявит разницы. А файлы — разные, и даже с разными именами! Синхронизация этот факт выявит на раз, и позволит увидеть разницу либо по имени, либо по содержимому, либо по дате.
Короче — ни один способ не надо абсолютизировать, иначе в некоторых случаях можно очень хорошо пролететь.
Последний раз редактировалось Avada Пт авг 19, 2011 11:57, всего редактировалось 1 раз.
Даже самая богатая фантазия
Не представит себе наши безобразия.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Flasher писал(а):тогда уж и остальную портабельность с буфером допиливать:
В коде апостроф перед tcm(4001) зачем появился?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Не раскомментировал (с переводом строки) - не видел. Исправлено.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Avada писал(а):Я так полагаю, что для пользы дела надо знать не только сам факт того, что что-то отличается, но и что именно отличается
Для такого случая можно предложить конгломерат под названием:
“Синхронизация одноимённых, но различающихся по размеру (файлов и) подкаталогов”. Всё примерно как и раньше, только добавлена последующая синхронизация выделенных объектов. Соответствующий кусочек кода:

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

With CreateObject("TCScript.Helper")
  T = .GetTextFromClip
  .SetTextToClip(S)
  .LockTC True
  .SendCommand 524
  .SendCommand 2033
  .SendKeystroke "{TAB}"
  .SendCommand 524
  .SendCommand 2033
  .SendKeystroke "{TAB}"
  .LockTC False
  .SetTextToClip(T)
  If Len (S) > 0 then
    .SendCommand 2020 'синхронизировать каталоги
    .SendKeystroke "{ENTER}"
  else 
    MsgBox "Сравнение завершено. Различий по размеру не найдено", vbOKOnly, "Сравнение"
  End If  
End With
Ред: Оператор If сделал последним.
Последний раз редактировалось sa Пт авг 19, 2011 22:14, всего редактировалось 1 раз.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

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

sa
.SendKeystroke "{TAB}"
.LockTC False
If Len (S) > 0 then
.SendCommand 2020, True 'синхронизировать каталоги
.SendKeystroke "{ENTER}"
else
MsgBox "Сравнение завершено. Различий по размеру не найдено", vbOKOnly, "Сравнение"
End If
.SetTextToClip(T)
End With
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

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

Сообщение Flasher »

Avada писал(а):И вообще у меня к скриптам претензий нет, я о другом говорил.
Я то это сразу понял. У sa руки просто чешуться что-то альтернативное предложить, не важно, надо оно кому-то или не надо. :)
Ответить