View previous topic :: View next topic |
Author |
Message |
avyor
Joined: 14 Aug 2011 Posts: 8 Location: Москва
|
(Separately) Posted: Wed Aug 17, 2011 22:00 Post subject: Сравнить в панелях списки каталогов |
|
|
Продолжение темы, начатой здесь 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 |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Wed Aug 17, 2011 22:11 Post subject: |
|
|
avyor wrote: | Quote: | ' Параметр: "%P" "%T" |
|
avyor wrote: | Затем сделал кнопку с ним с параметрами "%P? ?%T". |
С учётом потребностей название топика должно быть таким:
"Сравнить в панелях списки каталогов" |
|
Back to top |
|
|
sa
Joined: 29 Apr 2009 Posts: 2561
|
(Separately) Posted: Thu Aug 18, 2011 16:19 Post subject: |
|
|
Чтобы принудительно не оказываться в итоге на правой панели:
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 |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Thu Aug 18, 2011 16:27 Post subject: |
|
|
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 |
папка не пропущена?
Last edited by Flasher on Fri Aug 19, 2011 15:10; edited 2 times in total |
|
Back to top |
|
|
sa
Joined: 29 Apr 2009 Posts: 2561
|
(Separately) Posted: Thu Aug 18, 2011 16:44 Post subject: |
|
|
Flasher wrote: | папка не пропущена? | Пока правил, чтобы "было как у всех", пропустил:
Code: | Utils\TCFS2\TCFS2.exe |
Flasher wrote: | помню с Tab-ом проблемы какие-то были | Хорошо я не такой памятливый. |
|
Back to top |
|
|
avyor
Joined: 14 Aug 2011 Posts: 8 Location: Москва
|
(Separately) Posted: Fri Aug 19, 2011 01:18 Post subject: |
|
|
Flasher
Теперь заработало. Ещё раз спасибо!
Quote: | С учётом потребностей название топика должно быть таким:
"Сравнить в панелях списки каталогов" |
Да нет, это только для обкатки взял более простой вариант скрипта.
А теперь и полный вариант (сравнить и каталоги, и файлы) проверил.
Аналогично - сделал файл compareall.vbs, повесил на кнопку.
Тоже прекрасно работает.
Так что название темы поменяли зря.
Quote: | работать будет медленно (циклы) |
Для нескольких сотен папок (плюс файлов порядка сотни) - за 5-6 секунд
В отличие от пресловутой синхронизации, которая не закончилась и за полчаса и была мною прекращена принудительно (чтобы не мучалась ).
! | Avada: | Код заменён ссылкой. | |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Fri Aug 19, 2011 01:33 Post subject: |
|
|
avyor wrote: | Да нет, это только для обкатки взял более простой вариант скрипта. | Для обкатки проще взять то, что уже есть без лишних телодвижений.
Копировать весь код, приведённый в другом топике, сюда не имело никакого смысла. У нас принято заменять его ссылкой.
avyor wrote: | Так что название темы поменяли зря. | Не зря, п.ч. дублирование никому не нужно. По проблеме со скриптом можно было ограничиться и исходной темой (достаточно было написать код ошибки).
avyor wrote: | Для нескольких сотен папок (плюс файлов порядка сотни) - за 5-6 секунд | Информация, после которой последовало "Ускорил ...", - неактуальна.
Единственное, что там стоило приписать - это сдвоенные циклы, от которых след простыл. |
|
Back to top |
|
|
sa
Joined: 29 Apr 2009 Posts: 2561
|
(Separately) Posted: Fri Aug 19, 2011 07:59 Post subject: |
|
|
avyor wrote: | В отличие от пресловутой синхронизации, которая не закончилась и за полчаса и была мною прекращена принудительно |
Странно. Опция "по содержимому" точно не была включена? |
|
Back to top |
|
|
Avada
Joined: 01 Aug 2008 Posts: 10235 Location: Россия, Саратов
|
(Separately) Posted: Fri Aug 19, 2011 09:15 Post subject: |
|
|
avyor
Пара слов о "пресловутой синхронизации" и замечательном сравнении в панелях. Уже во всеоружии прогрессивных методик, с учётом возможностей новых скриптов, успешно решающих поставленную перед ними задачу.
Пример 1. Два каталога, содержащие энное число подкаталогов и файлов. Всё различие между ними, предположим, в одном файле на седьмом уровне вложенности. Я так полагаю, что для пользы дела надо знать не только сам факт того, что что-то отличается, но и что именно отличается, нет? Сколько времени и лишних телодвижений потребует многократное сравнение по мере опускания по уровням, пока мы не найдём подкаталог, содержащий искомое несовпадение? (Про возможность привлечь показ файлов без подкаталогов я знаю, но мы сейчас именно работу с каталогами обсуждаем.) И сколько эта же процедура, выполняемая один раз и дающая полную наглядность результата, займёт в инструменте синхронизации?
Пример 2. В простейшем случае имеем два каталога, в каждом — по одноимённому подкаталогу, а в каждом из них — по одному разному файлу одинакового размера. Скрипт честно отработает и не выявит разницы. А файлы — разные, и даже с разными именами! Синхронизация этот факт выявит на раз, и позволит увидеть разницу либо по имени, либо по содержимому, либо по дате.
Короче — ни один способ не надо абсолютизировать, иначе в некоторых случаях можно очень хорошо пролететь. _________________ Даже самая богатая фантазия
Не представит себе наши безобразия.
Last edited by Avada on Fri Aug 19, 2011 11:57; edited 1 time in total |
|
Back to top |
|
|
sa
Joined: 29 Apr 2009 Posts: 2561
|
(Separately) Posted: Fri Aug 19, 2011 11:27 Post subject: |
|
|
Flasher wrote: | тогда уж и остальную портабельность с буфером допиливать: |
В коде апостроф перед tcm(4001) зачем появился? |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Fri Aug 19, 2011 15:13 Post subject: |
|
|
Не раскомментировал (с переводом строки) - не видел. Исправлено. |
|
Back to top |
|
|
sa
Joined: 29 Apr 2009 Posts: 2561
|
(Separately) Posted: Fri Aug 19, 2011 17:56 Post subject: |
|
|
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 |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Fri Aug 19, 2011 18:05 Post subject: |
|
|
Допустимы случаи, когда смотреть содержимое одноразмерных папок не требуется, т.е. уже с имеющимся списком выделенных каталогов проводятся манипуляции по копированию/перемещению/удалению.
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 |
|
|
Avada
Joined: 01 Aug 2008 Posts: 10235 Location: Россия, Саратов
|
(Separately) Posted: Fri Aug 19, 2011 18:29 Post subject: |
|
|
Flasher wrote: | Допустимы случаи, когда смотреть содержимое одноразмерных папок не требуется, т.е. уже с имеющимся списком выделенных каталогов проводятся манипуляции по копированию/перемещению/удалению. |
Да, бывает и такое. Но как минимум не менее часто бывает и другое. И вообще у меня к скриптам претензий нет, я о другом говорил. _________________ Даже самая богатая фантазия
Не представит себе наши безобразия. |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Fri Aug 19, 2011 18:50 Post subject: |
|
|
Avada wrote: | И вообще у меня к скриптам претензий нет, я о другом говорил. | Я то это сразу понял. У sa руки просто чешуться что-то альтернативное предложить, не важно, надо оно кому-то или не надо. |
|
Back to top |
|
|
|