Страница 1 из 1

[VBS] Вставка команы cd в начало командной строки TC

Добавлено: Вт май 02, 2017 02:10
DrShark

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

' 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. Его настройка "Сценарии"->
"Разрешить программный доступ к буферу обмена" должна быть установлена в "Предлагать" или "Включить". Если выбрано "Отключить", скрипт в начале своей работы попытается изменить на "Предлагать", а после её окончания вернуть предыдущее состояние.
Скрипт заменяет (и не восстанавливает после завершения работы) содержимое буфера обмена.
Распространяется без каких-либо гараний, в т.ч. на поддержку и исправление багов (я не программист и не могу обещать их исправления).

Добавлено: Вт май 02, 2017 10:33
Flasher
На Win7 cкрипт забивается в цикле, печатает "СВ ", переключая туда-сюда NumLock.

Зачем такие костыли, когда есть простые решения?:

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

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 ' в командную строку ТС

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

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

Добавлено: Вт май 02, 2017 15:44
DrShark
Flasher писал(а):На Win7 cкрипт забивается в цикле, печатает "СВ ", переключая туда-сюда NumLock.
Когда будет доступ к машине с Win 7 - проверю.
Flasher писал(а):у нас на русском форуме шапку скрипта принято писать/дополнять на нашем языке. Тут далеко не все такие продвинутые англофилы с оффорума.
Шапка скрипта и комментарии в его теле является частью скрипта, т.е. частью ПО. Такого правила форума, которое обязывает локализировать распространяемое на форуме ПО на русский язык, нет. Описание скрипта в целом продубировано на русском в посте, где опубликован скрипт (позже его дополню). Условия использования скрипта свободнее некуда, так что те, кому принципиальны шапка и комментарии на русском, могут скопировать/изменить скрипт (и любую его часть) и заменить комментарии на русскоязычные.

Добавлено: Вт май 02, 2017 16:03
Flasher
DrShark
Без обид, но я сомневаюсь, что в таком виде кроме вас этим скриптом кто-то захочет на постоянной основе пользоваться.
Даже безотностельно оптимизации (много лишнего и не учтена блокировка работы с буфером).
А касаемо русского, то я вообще-то не о правилах писал, а о том, как тут принято. Это разные вещи. Из памятки:
Общие положения и рекомендации
Описание работы скрипта выносится в его шапку (верхние строки комментариев).
Если описание соответствует вашей задаче, то необходимо сделать следующее:
Если человек не знает языка из этого описания, то ему весьма трудно в этом разбираться, тем более новичку. А к скрипту пользователь возвращается без траты времени на поиск нужного топика на форуме (а тут уже другие факторы роль играют: наличие связи с интернетом и с форумом), заглядывая прежде всего в код. Кстати, вы не первый, кому приходится это объяснять.

Добавлено: Ср май 03, 2017 14:58
DrShark
Flasher писал(а):На Win7 cкрипт забивается в цикле, печатает "СВ "
Обновил код, попытка исправить зацикливание связанное с неотработкой ^C на быстром ПК.
Flasher писал(а):переключая туда-сюда NumLock.
Это воспроизвести пока не удалось (проверялось на машине с Winows 7 32 bit и клавиатуре с Num pad). И статус NumLock не похоже чтобы влиял на корректность отработки скрипта.

Добавлено: Ср май 03, 2017 16:48
Flasher
Короче говоря, вариант в моих условиях нерабочий. Язык по Alt+Shift не переключается ни так ни эдак:

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

CreateObject("WScript.Shell").SendKeys "%+"
'CreateObject("WScript.Shell").SendKeys "+{ALT}"
'CreateObject("WScript.Shell").SendKeys "%{SHIFT}"
А так весь скрипт это:

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

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

Добавлено: Ср май 03, 2017 18:52
DrShark
Flasher писал(а):вариант в моих условиях нерабочий. Язык по Alt+Shift не переключается ни так ни эдак
Просьба написать, если выяснится, что это связано с каким-то сторонним ПО, которое имеет приоритет на обработку этой комбинации клавиш.
Flasher писал(а):не учтена блокировка работы с буфером
Можете объяснить, что имеется в виду? Она в вашем варианте также не учтена?

Добавлено: Ср май 03, 2017 19:23
Flasher
DrShark писал(а):это связанно с каким-то строрнним ПО
Нет, не связано. Возможно, это связано с тем, что в отличии от старых версий при эмуляции нажатия сочетания этих модификаторов ожидается нажатие иных клавиш. Также имеется побочный эффект, когда Ctrl автоматически включает Shift. Да и сам метод SendKeys не добавляет надёжности. Например, при указании кириллицы ничего не печатается. Т. е. проблем хватает.
DrShark писал(а):Она в вашем варианте таже не учтена?
Нет. Я лишь натолкнул на лаконичность. А учтена она в куче моих других скриптов (1, 2, 3, 4 и т.д.).

Добавлено: Ср май 03, 2017 21:16
DrShark
Flasher писал(а):блокировка работы с буфером
Flasher писал(а):учтена она в куче моих других скриптов (1, 2, 3, 4 и т.д.).
Вы присваиваете значение 0 ключу HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3\1407 в случае, если его значение отличается от нуля.
У меня на Vista 32 bit значение ключа: 1, и буфер обмена в скриптах прекрасно работает. Насколько корректно ваше решение?

Добавлено: Ср май 03, 2017 21:39
Flasher
Вообще 0 - это разрешить, а 1 - это предлагать. Видимо, "предлагать" без обозревателя воспринимается аналогично. Можно поставить If A > 1. Но скрипт всё равно вернёт прежнее значение, т. ч. и текущий вариант тоже корректен.

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

Добавлено: Пт май 05, 2017 20:26
Flasher
DrShark
Никогда не имел дел с мелкомягкими именно из-за сверхмалой вероятности положительного исхода. Да и в данном случае мне это не особо интересно, ибо пользуюсь более годными для этих вещей инструментами (примеры выше).
Что касаемо всяких мелочей типа неубранного в предпоследней строке пробела и подводки к сумме переключений, то это секундные вопросы, которые даже обсуждать не хочется. Если считаете, что многократные вызовы SendKeys, бессмысленные процедуры, объявления переменных объектов, присвоения Nothing, многострочные записи условий - это всё не лишнее, то флаг вам в руки. Нравится - пользуйтесь.

Добавлено: Пт май 05, 2017 21:32
DrShark
Flasher писал(а):Если считаете ... флаг вам в руки. Нравится - пользуйтесь.
Забавно, я вроде достаточно понятно выразился и я не делал однозначных утвержений о том, что якобы всё перечисленное вами нужно обязательно. Но вы, разумеется, не могли не проявить своего хамства и высокомерия. За эти 3 с копейками года начитался здесь подобного (не только от вас), и не жалею, что оставил активное участие на этом форуме.
В общем, спасибо за дискуссию и за сэкономленное время (я всё равно, пусть не так и не сейчас, но написал бы этот скрипт).

Добавлено: Сб май 06, 2017 00:11
Flasher
DrShark писал(а):не могли не проявить своего хамства и высокомерия
Я лишь констатирую те очевидности, от которых вы по неясной мне причине отказываетесь, как и от более грамотных решений. Потому моя реакция такая, какая есть, но слово "высокомерие" и тем более "хамство" к ней ни в коей мере не относится. У вас весьма искажённое представление сути моих слов, а точнее ложная их оценка, которая по меньшей мере тянет на оскорбление. И прежде чем искать минусы в других, стоило бы начать с себя:
DrShark писал(а):Я попросил ..., а вы навязываете ... Если нет желания ..., напишите прямо