Windows Script Host

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

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

AgereS
Сообщения: 6
Зарегистрирован: Чт мар 25, 2010 08:33

Сообщение AgereS »

Возможно я сейчас скажу глупость
я у себя не нашёл TCWSHelp.exe
он ставиться отдельно или должен идти вместе с Total Commander
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

AgereS
Разумеется, отдельно! Между прочим, это было всего несколькими постами раньше в этой же теме.
И сколько можно напоминать про поиск по форуму?
Лимит глупых вопросов исчерпан, далее будут санкции от модератора. Правила форума — в шапке любого подфорума. Например, здесь.
Даже самая богатая фантазия
Не представит себе наши безобразия.
AgereS
Сообщения: 6
Зарегистрирован: Чт мар 25, 2010 08:33

Сообщение AgereS »

Вроде частично разобрался спасибо
Вот только почему (маркировка файлов через один)
срабатывает не всегда так и не могу понять



P|S Avada - Что касается поиска, то если бы я знал как сформулировать вкраци то что ищу, то явно воспользовался им
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Да, забавно работает (ZebraMark-2.vbs):
Сначала выделил 60 файлов (правильно, в папке 121 файл)
Затем опять 60 файлов
Затем 30 файлов (я не поверил глазам и не снял скриншот)
Затем 15 файлов
Изображение
Затем всегда "0" файлов, после перезапуска TC нормальная работа скрипта не восстанавливается
Изображение
TC 7.50a, Script Helper beta11, beta10+
В папках с малым кол-вом файлов (<20) работает правильно
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Tol!k
Сам этот скрипт иногда использовал в разных по объёму папках, ничего подобного не замечалось.
Добавлено: А вот в режиме BranchView срабатывает криво. Ну тут причина ясна: относительные пути.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

AgereS писал(а):Вот только почему (маркировка файлов через один) срабатывает не всегда так и не могу понять
Не показалось, что не выделяются файлы, в которых имеются символы на русском? По-моему, имеется проблема с копированием имён этих файлов в буфер.
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Сообщение Volniy »

Причина выделения нестабильного количества файлов очевидна. В начале скрипта есть команда выделения всех файлов и она не всегда успевает выполнится до начала исполнения следующей команды. А значит скрипт работает с меньшим кол-вом файлов. Решается просто:

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

TCS.SendCommand "cm_SelectAll", True
Что касается "невыделения" файлов с русскими именами, то это косяк с русским юникодом. Пока не знаю, что с этим делать. Возможно, поможет классика - редактирование реестра, вроде вот оно:

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

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"1250"="c_1251.nls"
"1252"="c_1251.nls"
только я сам пробовать не стал, меня этот патч не устраивает по многим причинам.

Что касается BranchView, так там действительно дело в относительных путях. Решаемо:

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

' File:         ZebraMark-3.vbs
' Description:  Помечает все файлы и каталоги через один
' What's new:   Работает в BranchView
' Requirements: WSH Helper for TC by Volniy 
' Copyright:    (c) 2010, Volniy 

Option Explicit 
Dim List, TCS, Cnt, Buf, CurDir
Set TCS = CreateObject("TCScript.Helper") 

TCS.SendCommand "cm_SelectAll", True  'Выбрать всё 
CurDir = TCS.GetSrcPath
TCS.SendCommand "cm_CopyFullNamesToClip", True
List = Split(TCS.GetTextFromClip,vbNewLine) 

For Cnt=LBound(List) To UBound(List) 
  If Cnt Mod 2 = 1 Then 
     Buf = Buf & Mid(List(Cnt), Len(CurDir) +2) & vbNewLine 
  End If 
Next 
TCS.SetTextToClip CStr(Buf) 
TCS.SendCommand "cm_LoadSelectionFromClip", True 
TCS.GetSrcSelectedFiles

MsgBox "Выделено ""зеброй"": " & (UBound(TCS.GetSrcSelectedFiles) +1) & _
       " файлов/каталогов." , vbInformation, "Завершено!" 
Set TCS = Nothing
WScript.Quit
Последний раз редактировалось Volniy Сб мар 27, 2010 13:21, всего редактировалось 2 раза.
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Volniy писал(а):Решается просто:

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

TCS.SendCommand "cm_SelectAll", True
Ни один файл не выделяется, но при этом радостно сообщается, что выделено 60…30…15… файлов.
Решилось так

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

TCS.SendCommand "cm_SelectAll", False
TCS.SendCommand "cm_CopyFullNamesToClip", True
Volniy, а почему не помогает пауза? Даже TCS.Pause = 1000

На память, пропущенный в прошлый раз скриншот
http://i054.radikal.ru/1003/f6/511078bb93cd.png
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Volniy писал(а):поможет классика - редактирование реестра
Но поможет она только тем, кто пойдёт на подмену кодовых страниц. А вот, если не править реестр, то получается, что с приходом юникодного TC ситуация с русским усугубилась: с тем же скриптом в версии 7.04a проблемы "невыделения" файлов с русскими именами нет.
Volniy писал(а):Пока не знаю, что с этим делать.
Может можно что-нибудь придумать?
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Сообщение Volniy »

Tol!k писал(а):Volniy, а почему не помогает пауза? Даже TCS.Pause = 1000
Видимо потому что пауза эта создается перед исполнением команды. Если же нужна явная задержка, с beta11 уже можно использовать

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

TCS.Sleep 1000
Кстати, предложенный мной вариант у меня стабильно работает. В 3-ей зебре после команды выделения есть макрос TCS.GetSrcPath , который является набором нескольких команд. Это дает дополнительную задержку, я думаю.

Я исправил немного код скрипта, чтобы сообщение в конце его работы ("радостно") показывало реальное число выделенных файлов.
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Volniy писал(а):Видимо потому что пауза эта создается перед исполнением команды
Не понимаю, в чём разница: перед и между

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

TCS.Pause = 1000
TCS.SendCommand "cm_SelectAll", False
TCS.SendCommand "cm_CopyFullNamesToClip", False
Судя по неспешному выполнению, пауза есть. Но она "не такая", бесполезная Изображение
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Кажется начинаю понимать, пауза нужна _после_ cm_CopyFullNamesToClip
Но почему TCS.Pause=1000 не действует на следующую команду List=Split(TCS.GetTextFromClip,vbNewLine) ?
Вернее, действует но не помогает
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Сообщение Volniy »

Я все-таки думаю, что проблема именно а в том, что не успевает выполнится команда выделения всех файлов, а не копирования имен в буфер. Тоесть пауза нужна после команды "cm_SelectAll" . Попробуй все-таки тут вставить TCS.Sleep.

Еще раз про разницу между TCS.Pause и TCS.Sleep.
TCS.Sleep - это одноразовая команда, останавливающая исполнение скрипта на указанный в милисекундах промежуток времени
TCS.Pause - это свойство самого хелпера. Соответственно его величина (по-умолчанию = 70) задается для всего скрипта, в котором используется хелпер и влияет только на выполняемые им команды. Задержка происходит перед непосредственным выполнением команды.
Pause, насколько я помню, было когда-то введено для более четкого срабатывания некоторых команд. На сегодняшний день (особенно после добавления TCS.Sleep) я уже сомневаюсь в необходимости этого свойства объекта Helper

PS Попробовал сейчас прямую работу с Буфером обмена (а была она реализована через движок VB). Так вот, если я напрямую устанавливаю данные для Unicode формата - проблемы с выделением русских имен файлов пропадают. Но при этом содержимое текстового формата - мусорное (винда сама производит конвертацию). Может мне для TCS.SetTextToClip стоит добавить опциональный параметр для работы именно с Unicode текстом?
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Volniy писал(а):Может мне для TCS.SetTextToClip стоит добавить опциональный параметр для работы именно с Unicode текстом?
Мне кажется, что такой параметр пригодился бы многим.
PS А вот в команде TCS.SendKeystroke проблем с юникодной версией TC, по-моему, стало наоборот меньше, чем раньше: из четырёх возможных сочетаний, неверно отрабатывается только вариант английского текста при русской раскладке клавиатуры.
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Volniy писал(а):Я все-таки думаю, что проблема именно а в том, что не успевает выполнится команда выделения всех файлов, а не копирования имен в буфер. Тоесть пауза нужна после команды "cm_SelectAll" . Попробуй все-таки тут вставить TCS.Sleep.
Пробовал. В моём случае правильно работает только так:

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

TCS.SendCommand "cm_SelectAll", False
TCS.SendCommand "cm_CopyFullNamesToClip", False
TCS.Sleep 1000
Volniy писал(а):TCS.Pause - это свойство самого хелпера …и влияет только на выполняемые им команды.
Т.е. в следующей строке List=Split(TCS.GetTextFromClip,vbNewLine) TCS.Pause=1000 не влияет на Split (но влияет на TCS.GetTextFromClip) ?
Это бы всё объясняло.
Ответить