[VBS] Вставка команы cd в начало командной строки TC
Select messages from
# through # FAQ
[/[Print]\]

Total Commander -> Автоматизация Total Commander

#1: [VBS] Вставка команы cd в начало командной строки TC Author: DrSharkLocation: Kyiv, Ukraine PostPosted: Tue May 02, 2017 03:10
    —
Code:
' cd2cmdline.vbs - inserts CD command at the beginning of the Total Commander command line
' v. 04052017
' Replaces clipboard content without restoring
' Requires Internet Explorer and its option "Allow Programmatic clipboard access"
' for "Scripting" set to either "Enable" or "Prompt".
' (if set to "Disable", the script will try to change it to "Prompt" only for its run time and then restore to previous state)
' Written in 2017 by DrShark
' To the extent possible under law, the author(s) have dedicated all copyright and related
' and neighboring rights to this software to the public domain worldwide.
' This software is distributed without any warranty.
' A copy of the CC0 Public Domain Dedication for this software is available at
' <http://creativecommons.org/publicdomain/zero/1.0/>.

Public WSH, objHTML
Set WSH = CreateObject("WScript.Shell")
Set objHTML = CreateObject("htmlfile")
clpaccesskeylocation = "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3\1407"
On Error Resume Next
clpacckessvalue = WSH.RegRead(clpaccesskeylocation)
If clpacckessvalue > 1 Or Err.Number <> 0 Then WSH.RegWrite clpaccesskeylocation, 1, "REG_DWORD"

main

Sub main
Set clpbrdtext = Nothing
' Inserting CD command to TC cmdline:
WSH.SendKeys "+{Right}{Home}CD "

' Selecting the CD command in the cmdline:
WSH.SendKeys "{Home}"
WSH.SendKeys "{Right}{Right}"
WSH.SendKeys "+{Home}"
' Copy the selected command to clipboard
WSH.SendKeys "^C"
WScript.Sleep 10
clpbrdtext = objHTML.ParentWindow.ClipboardData.GetData("text")
' Check whether command was copied with English keyboard layout:
compstr = StrComp(clpbrdtext, "CD")
 If compstr = 0 Then
  WSH.SendKeys "{Home}"
  quitscript
 Else
  keyblayoutchange
End If
End Sub

Sub keyblayoutchange
togglevalue = WSH.RegRead("HKCU\Keyboard Layout\Toggle\Hotkey")
Select Case togglevalue
  Case 1 togglehotkey = "%+" : Case 2 togglehotkey = "^+" : Case 4 togglehotkey = "`"
End Select
WSH.SendKeys togglehotkey
WSH.SendKeys "{Home}{Right}{Right}{Right}"
WSH.SendKeys "+{Home}"
WSH.SendKeys "{BACKSPACE}"
main
End Sub

Sub quitscript
If clpacckessvalue > 1 Then WSH.RegWrite clpaccesskeylocation, clpacckessvalue, "REG_DWORD"
WScript.Sleep 100
Set clpbrdtext = Nothing
Set objHTML = Nothing
Set WSH = Nothing
End Sub

После запуска из TC скрипт устанавливает фокус на командную строку TC и вставляет в её начало команду CD с последующим пробелом, не затирая уже введенное содержимое. Вроде работает, как ожидается.
Если способ установки фокуса в ком. строку кажется недостаточно надёжным, в TC 9 в кнопке можно перед em_ командой, которая вызывает скрипт, прописать cm_FocusCmdLine.
Требования: Internet Explorer. Его настройка "Сценарии"->
"Разрешить программный доступ к буферу обмена" должна быть установлена в "Предлагать" или "Включить". Если выбрано "Отключить", скрипт в начале своей работы попытается изменить на "Предлагать", а после её окончания вернуть предыдущее состояние.
Скрипт заменяет (и не восстанавливает после завершения работы) содержимое буфера обмена.
Распространяется без каких-либо гараний, в т.ч. на поддержку и исправление багов (я не программист и не могу обещать их исправления).


Last edited by DrShark on Thu May 04, 2017 23:10; edited 5 times in total

#2:  Author: FlasherLocation: Москва PostPosted: Tue May 02, 2017 11:33
    —
На Win7 cкрипт забивается в цикле, печатает "СВ ", переключая туда-сюда NumLock.

Зачем такие костыли, когда есть простые решения?:
Code:
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe
/ef tcm(4003,1) eval(settext_wait(`cd `,findwnd(Edit,,,0,1))) send({END})
wciconex.dll,156
Вставить 'cd ' в командную строку ТС
Code:
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe
/ef tcm(4003,1) send(`{HOME}~(cd) {END}`)
wciconex.dll,156
Вставить спереди 'cd ' в командной строке ТС

P.S.: И на всякий случай, у нас на русском форуме шапку скрипта принято писать/дополнять на нашем языке. Тут далеко не все такие продвинутые англофилы с оффорума.

#3:  Author: DrSharkLocation: Kyiv, Ukraine PostPosted: Tue May 02, 2017 16:44
    —
Flasher wrote:
На Win7 cкрипт забивается в цикле, печатает "СВ ", переключая туда-сюда NumLock.
Когда будет доступ к машине с Win 7 - проверю.

Flasher wrote:
у нас на русском форуме шапку скрипта принято писать/дополнять на нашем языке. Тут далеко не все такие продвинутые англофилы с оффорума.
Шапка скрипта и комментарии в его теле является частью скрипта, т.е. частью ПО. Такого правила форума, которое обязывает локализировать распространяемое на форуме ПО на русский язык, нет. Описание скрипта в целом продубировано на русском в посте, где опубликован скрипт (позже его дополню). Условия использования скрипта свободнее некуда, так что те, кому принципиальны шапка и комментарии на русском, могут скопировать/изменить скрипт (и любую его часть) и заменить комментарии на русскоязычные.

#4:  Author: FlasherLocation: Москва PostPosted: Tue May 02, 2017 17:03
    —
DrShark
Без обид, но я сомневаюсь, что в таком виде кроме вас этим скриптом кто-то захочет на постоянной основе пользоваться.
Даже безотностельно оптимизации (много лишнего и не учтена блокировка работы с буфером).
А касаемо русского, то я вообще-то не о правилах писал, а о том, как тут принято. Это разные вещи. Из памятки:
Quote:
Общие положения и рекомендации
Описание работы скрипта выносится в его шапку (верхние строки комментариев).
Если описание соответствует вашей задаче, то необходимо сделать следующее:
Если человек не знает языка из этого описания, то ему весьма трудно в этом разбираться, тем более новичку. А к скрипту пользователь возвращается без траты времени на поиск нужного топика на форуме (а тут уже другие факторы роль играют: наличие связи с интернетом и с форумом), заглядывая прежде всего в код. Кстати, вы не первый, кому приходится это объяснять.

#5:  Author: DrSharkLocation: Kyiv, Ukraine PostPosted: Wed May 03, 2017 15:58
    —
Flasher wrote:
На Win7 cкрипт забивается в цикле, печатает "СВ "
Обновил код, попытка исправить зацикливание связанное с неотработкой ^C на быстром ПК.
Flasher wrote:
переключая туда-сюда NumLock.

Это воспроизвести пока не удалось (проверялось на машине с Winows 7 32 bit и клавиатуре с Num pad). И статус NumLock не похоже чтобы влиял на корректность отработки скрипта.

#6:  Author: FlasherLocation: Москва PostPosted: Wed May 03, 2017 17:48
    —
Короче говоря, вариант в моих условиях нерабочий. Язык по Alt+Shift не переключается ни так ни эдак:
Code:
CreateObject("WScript.Shell").SendKeys "%+"
'CreateObject("WScript.Shell").SendKeys "+{ALT}"
'CreateObject("WScript.Shell").SendKeys "%{SHIFT}"

А так весь скрипт это:
Code:
With CreateObject("WScript.Shell")
  .SendKeys "+{Left}{Home}cd {Left}+{Home}^c"
  If CreateObject("htmlfile").ParentWindow.ClipboardData.GetData("text") = "cd" Then _
  .SendKeys "{End}" : WSH.Quit
  Select Case .RegRead("HKCU\Keyboard Layout\Toggle\Hotkey")
     Case 1 HK = "+%" : Case 2 HK = "^+" : Case 4 HK = "`"
  End Select : .SendKeys HK & "{Del}cd {End}"
End With

#7:  Author: DrSharkLocation: Kyiv, Ukraine PostPosted: Wed May 03, 2017 19:52
    —
Flasher wrote:
вариант в моих условиях нерабочий. Язык по Alt+Shift не переключается ни так ни эдак

Просьба написать, если выяснится, что это связано с каким-то сторонним ПО, которое имеет приоритет на обработку этой комбинации клавиш.
Flasher wrote:
не учтена блокировка работы с буфером

Можете объяснить, что имеется в виду? Она в вашем варианте также не учтена?


Last edited by DrShark on Wed May 03, 2017 21:38; edited 2 times in total

#8:  Author: FlasherLocation: Москва PostPosted: Wed May 03, 2017 20:23
    —
DrShark wrote:
это связанно с каким-то строрнним ПО
Нет, не связано. Возможно, это связано с тем, что в отличии от старых версий при эмуляции нажатия сочетания этих модификаторов ожидается нажатие иных клавиш. Также имеется побочный эффект, когда Ctrl автоматически включает Shift. Да и сам метод SendKeys не добавляет надёжности. Например, при указании кириллицы ничего не печатается. Т. е. проблем хватает.

DrShark wrote:
Она в вашем варианте таже не учтена?
Нет. Я лишь натолкнул на лаконичность. А учтена она в куче моих других скриптов (1, 2, 3, 4 и т.д.).

Last edited by Flasher on Wed May 03, 2017 23:50; edited 1 time in total

#9:  Author: DrSharkLocation: Kyiv, Ukraine PostPosted: Wed May 03, 2017 22:16
    —
Flasher wrote:
блокировка работы с буфером
Flasher wrote:
учтена она в куче моих других скриптов (1, 2, 3, 4 и т.д.).
Вы присваиваете значение 0 ключу HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3\1407 в случае, если его значение отличается от нуля.
У меня на Vista 32 bit значение ключа: 1, и буфер обмена в скриптах прекрасно работает. Насколько корректно ваше решение?

#10:  Author: FlasherLocation: Москва PostPosted: Wed May 03, 2017 22:39
    —
Вообще 0 - это разрешить, а 1 - это предлагать. Видимо, "предлагать" без обозревателя воспринимается аналогично. Можно поставить If A > 1. Но скрипт всё равно вернёт прежнее значение, т. ч. и текущий вариант тоже корректен.

#11:  Author: DrSharkLocation: Kyiv, Ukraine PostPosted: Thu May 04, 2017 22:44
    —
Flasher wrote:
не учтена блокировка работы с буфером
Добавил.
Flasher wrote:
Вообще 0 - это разрешить, а 1 - это предлагать. Видимо, "предлагать" без обозревателя воспринимается аналогично.
Проверил: объект InternetExplorer.Application делает запрос и на запись и на чтение, объект htmlfile умеет только читать и получает текст буфера обмена без запроса, видимо MS считает его более безопасным.
Flasher wrote:
много лишнего
Не так много, как кажется на первый взгляд:
1) Ctrl+Enter ставит имя файла/папки в ком. строку, раскладка русская. Далее запуск вашего варианта скрипта: он ставит 2 пробела после cd, мой же, как положено, 1.
2) переход в ком. строку, ввод руками cd c:\, затем дважды Esc для очистки и выхода из ком. строки, затем запускаем ваш скрипт: в ком. строке будет
св \
или
cd \
У моём варианте будет
cd c:\
(да, мой скрипт в этом случае не убирает то, что вставляется автодополнением, но и не делает из пути огрызок).
3) у меня 4 раскладки: английская, украинская, русская, японская (идут в этом порядке). Ваш вариант скрипта не работает, если текущая раскладка украинская: переводит раскладку на русскую и останавливается, оставляя в ком. строке "св ".
Flasher wrote:
Alt+Shift ... при эмуляции нажатия сочетания этих модификаторов ожидается нажатие иных клавиш. ... Ctrl автоматически включает Shift ... при указании кириллицы ничего не печатается.
У вас Internet Explorer 11, который на Windows 7 будет поддерживаться до начала 2020 г. Попробуйте сообщить об ошибках в Microsoft, есть небольшой шанс, что их исправят.

#12:  Author: FlasherLocation: Москва PostPosted: Fri May 05, 2017 21:26
    —
DrShark
Никогда не имел дел с мелкомягкими именно из-за сверхмалой вероятности положительного исхода. Да и в данном случае мне это не особо интересно, ибо пользуюсь более годными для этих вещей инструментами (примеры выше).
Что касаемо всяких мелочей типа неубранного в предпоследней строке пробела и подводки к сумме переключений, то это секундные вопросы, которые даже обсуждать не хочется. Если считаете, что многократные вызовы SendKeys, бессмысленные процедуры, объявления переменных объектов, присвоения Nothing, многострочные записи условий - это всё не лишнее, то флаг вам в руки. Нравится - пользуйтесь.

#13:  Author: DrSharkLocation: Kyiv, Ukraine PostPosted: Fri May 05, 2017 22:32
    —
Flasher wrote:
Если считаете ... флаг вам в руки. Нравится - пользуйтесь.
Забавно, я вроде достаточно понятно выразился и я не делал однозначных утвержений о том, что якобы всё перечисленное вами нужно обязательно. Но вы, разумеется, не могли не проявить своего хамства и высокомерия. За эти 3 с копейками года начитался здесь подобного (не только от вас), и не жалею, что оставил активное участие на этом форуме.
В общем, спасибо за дискуссию и за сэкономленное время (я всё равно, пусть не так и не сейчас, но написал бы этот скрипт).

#14:  Author: FlasherLocation: Москва PostPosted: Sat May 06, 2017 01:11
    —
DrShark wrote:
не могли не проявить своего хамства и высокомерия
Я лишь констатирую те очевидности, от которых вы по неясной мне причине отказываетесь, как и от более грамотных решений. Потому моя реакция такая, какая есть, но слово "высокомерие" и тем более "хамство" к ней ни в коей мере не относится. У вас весьма искажённое представление сути моих слов, а точнее ложная их оценка, которая по меньшей мере тянет на оскорбление. И прежде чем искать минусы в других, стоило бы начать с себя:
DrShark wrote:
Я попросил ..., а вы навязываете ... Если нет желания ..., напишите прямо



Total Commander -> Автоматизация Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Page 1 of 1

Powered by phpBB © 2001, 2005 phpBB Group