Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Сравнить в панелях списки каталогов
Goto page 1, 2  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
avyor



Joined: 14 Aug 2011
Posts: 8
Location: Москва

Post (Separately) Posted: Wed Aug 17, 2011 22:00    Post subject: Сравнить в панелях списки каталогов Reply with quote

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

Flasher

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

Code:

' Выделение  в панелях одноимённых, но разноразмерных папок
' Необходима регистрация 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 писал:
Quote:

регистрация 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"

Но выдается сообщение об ошибке:

Quote:

Сценарий: 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 и тоже сделал кнопку.
Теперь в сообщении об ошибке:

Quote:

Сценарий: 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-й символ - это пробел.

Что не так?
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Wed Aug 17, 2011 22:11    Post subject: Reply with quote

avyor wrote:
Quote:
' Параметр: "%P" "%T"
avyor wrote:
Затем сделал кнопку с ним с параметрами "%P? ?%T".

С учётом потребностей название топика должно быть таким:
"Сравнить в панелях списки каталогов"
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2687

Post (Separately) Posted: Thu Aug 18, 2011 16:19    Post subject: Reply with quote

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

2) пользователям утилиты TCFS2 (с модулем TCFS2Tools) можно заменить кусок кода (6 строк) между .SetTextToClip(S) и .SetTextToClip(T) на что-то вроде
Code:
  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)
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Thu Aug 18, 2011 16:27    Post subject: Reply with quote

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

Code:
Utils\TCFS2.exe
папка не пропущена?

Last edited by Flasher on Fri Aug 19, 2011 15:10; edited 2 times in total
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2687

Post (Separately) Posted: Thu Aug 18, 2011 16:44    Post subject: Reply with quote

Flasher wrote:
папка не пропущена?
Пока правил, чтобы "было как у всех", пропустил:
Code:
Utils\TCFS2\TCFS2.exe

Flasher wrote:
помню с Tab-ом проблемы какие-то были
Хорошо я не такой памятливый. Smile
Back to top
View user's profile Send private message
avyor



Joined: 14 Aug 2011
Posts: 8
Location: Москва

Post (Separately) Posted: Fri Aug 19, 2011 01:18    Post subject: Reply with quote

Flasher
Теперь заработало. Ещё раз спасибо!

Quote:
С учётом потребностей название топика должно быть таким:
"Сравнить в панелях списки каталогов"

Да нет, это только для обкатки взял более простой вариант скрипта.

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

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

Так что название темы поменяли зря.

Quote:
работать будет медленно (циклы)

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

 !  Avada:
Код заменён ссылкой.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Fri Aug 19, 2011 01:33    Post subject: Reply with quote

avyor wrote:
Да нет, это только для обкатки взял более простой вариант скрипта.
Для обкатки проще взять то, что уже есть без лишних телодвижений.
Копировать весь код, приведённый в другом топике, сюда не имело никакого смысла. У нас принято заменять его ссылкой.
avyor wrote:
Так что название темы поменяли зря.
Не зря, п.ч. дублирование никому не нужно. По проблеме со скриптом можно было ограничиться и исходной темой (достаточно было написать код ошибки).

avyor wrote:
Для нескольких сотен папок (плюс файлов порядка сотни) - за 5-6 секунд
Информация, после которой последовало "Ускорил ...", - неактуальна.
Единственное, что там стоило приписать - это сдвоенные циклы, от которых след простыл.
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2687

Post (Separately) Posted: Fri Aug 19, 2011 07:59    Post subject: Reply with quote

avyor wrote:
В отличие от пресловутой синхронизации, которая не закончилась и за полчаса и была мною прекращена принудительно

Странно. Опция "по содержимому" точно не была включена?
Back to top
View user's profile Send private message
Avada



Joined: 01 Aug 2008
Posts: 10415
Location: Россия, Саратов

Post (Separately) Posted: Fri Aug 19, 2011 09:15    Post subject: Reply with quote

avyor
Пара слов о "пресловутой синхронизации" и замечательном сравнении в панелях. Уже во всеоружии прогрессивных методик, с учётом возможностей новых скриптов, успешно решающих поставленную перед ними задачу.
Пример 1. Два каталога, содержащие энное число подкаталогов и файлов. Всё различие между ними, предположим, в одном файле на седьмом уровне вложенности. Я так полагаю, что для пользы дела надо знать не только сам факт того, что что-то отличается, но и что именно отличается, нет? Сколько времени и лишних телодвижений потребует многократное сравнение по мере опускания по уровням, пока мы не найдём подкаталог, содержащий искомое несовпадение? (Про возможность привлечь показ файлов без подкаталогов я знаю, но мы сейчас именно работу с каталогами обсуждаем.) И сколько эта же процедура, выполняемая один раз и дающая полную наглядность результата, займёт в инструменте синхронизации?
Пример 2. В простейшем случае имеем два каталога, в каждом — по одноимённому подкаталогу, а в каждом из них — по одному разному файлу одинакового размера. Скрипт честно отработает и не выявит разницы. А файлы — разные, и даже с разными именами! Синхронизация этот факт выявит на раз, и позволит увидеть разницу либо по имени, либо по содержимому, либо по дате.
Короче — ни один способ не надо абсолютизировать, иначе в некоторых случаях можно очень хорошо пролететь.
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.


Last edited by Avada on Fri Aug 19, 2011 11:57; edited 1 time in total
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2687

Post (Separately) Posted: Fri Aug 19, 2011 11:27    Post subject: Reply with quote

Flasher wrote:
тогда уж и остальную портабельность с буфером допиливать:

В коде апостроф перед tcm(4001) зачем появился?
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Fri Aug 19, 2011 15:13    Post subject: Reply with quote

Не раскомментировал (с переводом строки) - не видел. Исправлено.
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2687

Post (Separately) Posted: Fri Aug 19, 2011 17:56    Post subject: Reply with quote

Avada wrote:
Я так полагаю, что для пользы дела надо знать не только сам факт того, что что-то отличается, но и что именно отличается

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


Last edited by sa on Fri Aug 19, 2011 22:14; edited 1 time in total
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Fri Aug 19, 2011 18:05    Post subject: Reply with quote

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

sa
Quote:
.SendKeystroke "{TAB}"
.LockTC False
If Len (S) > 0 then
.SendCommand 2020, True 'синхронизировать каталоги
.SendKeystroke "{ENTER}"
else
MsgBox "Сравнение завершено. Различий по размеру не найдено", vbOKOnly, "Сравнение"
End If
.SetTextToClip(T)
End With
Back to top
View user's profile Send private message
Avada



Joined: 01 Aug 2008
Posts: 10415
Location: Россия, Саратов

Post (Separately) Posted: Fri Aug 19, 2011 18:29    Post subject: Reply with quote

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

Да, бывает и такое. Но как минимум не менее часто бывает и другое. И вообще у меня к скриптам претензий нет, я о другом говорил.
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Fri Aug 19, 2011 18:50    Post subject: Reply with quote

Avada wrote:
И вообще у меня к скриптам претензий нет, я о другом говорил.
Я то это сразу понял. У sa руки просто чешуться что-то альтернативное предложить, не важно, надо оно кому-то или не надо. Smile
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group