Рестарт/перезапуск TC

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

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

Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Avada писал(а):в отличие от кое-чего из предложенного ранее
И от чего же? Я пока не увидел.
Вот как я вижу то, что ещё может приблизится к понятию удобства и универсальности:

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

'============================================================
' Перезапуск ТС с возвратом к открытым в корне архивам,
' разным элементам в частично заблокированных вкладках
' и виртуальным папкам c правильной установкой курсора

' Условия:
' желательна последняя верcия TCFS2 с обновлениями TCFS2.ini
' необходима установка плагина TCFS2Tools

' Параметры: "%X%P%Z" "%T" ""%N"" ""%M""

' Flasher ©
'======================== Путь к TCFS2 ======================
TCFS2 = """%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe"""
'=============== Путь к ini c секциями истории ==============
HrIni = "%COMMANDER_PATH%\RedirectINI\History.ini"
'============================================================
With WScript.Arguments
  If .Count < 4 Then MsgBox "Параметры не соответствуют описанию!", 48 : WScript.Quit : End If
  LP = .Item(0) : RP = .Item(1) : N = .Item(2) : M = .Item(3)
End With : Set FSO = CreateObject("Scripting.FileSystemObject")

With CreateObject("WScript.Shell")
  .Run TCFS2 & " /ef tcm(582)", 0, True
  HrIni = .ExpandEnvironmentStrings(HrIni)
  .Run TCFS2 & " /ef ""set_ini(`" & HrIni & "`, Active, Left, L_isActive)""", 0, True
  Set OIni = FSO.OpenTextFile(HrIni, 1)
  All = OIni.ReadAll : OIni.Close : Set OIni = Nothing
  LH  = Split(All, "[LeftHistory]"  & vbNewLine & "0=")(1)
  RH  = Split(All, "[RightHistory]" & vbNewLine & "0=")(1)
  AP  = Split(All, "[Active]"    & vbNewLine & "Left=")(1)
  L   = Left(LH, InStr(LH, vbnewline) - 1)
  R   = Left(RH, InStr(RH, vbnewline) - 1)
  LA  = Left(AP, InStr(AP, vbnewline) - 1)
  All = "" : .Run TCFS2 & " /ef tcm(24340)", 0, True
End With

If LA Then Side = "/P=L" Else Side = "/P=R"
If FSO.FileExists(LP & N) Then LO = "\|" Else N = ""
If FSO.FileExists(RP & M) Then RO = "\|" Else M = "" : Set FSO = Nothing
If Right(L, 1) = "/" Then L = Left(L, Len(L) - 1) : LO = "" : N = "" : End If
If Right(R, 1) = "/" Then R = Left(R, Len(R) - 1) : RO = "" : M = "" : End If
If Len(L) > Len(LP) Then LM = Left(L, Len(L)-(Len(LP)-1))
If Len(R) > Len(RP) Then RM = Left(R, Len(R)-(Len(RP)-1))

Set ListL = CreateObject("Scripting.Dictionary")
Set ListR = CreateObject("Scripting.Dictionary")
With CreateObject("Shell.Application")
  Desk = "\" & .NameSpace("C:").ParentFolder.ParentFolder & ""
  For Each i In Array(&Ha, &H3, &H4, &H11, &H12)
    ListL.Add .NameSpace(i).Self.Path & "|" & LP , ""
    ListR.Add .NameSpace(i).Self.Path & "|" & RP , ""
  Next
End With

Sub Run(Par, Keys)
  With CreateObject("WScript.Shell")
    Set TC = .Exec("""%COMMANDER_EXE%"" " & Par)
    PID = TC.ProcessID : Do : A = .AppActivate(PID) : Loop Until A
    WScript.Sleep 40 : .Exec(TCFS2 & " /ef tcm(2121) " & Keys)
  End With : WScript.Quit
End Sub

Act = """tcm(4002), eval(L_isActive) | tcm(4001)"""
If LA = 1 Then Key = "tcm(4001)" Else Key = "tcm(4002)"
If LP = Desk And RP = Desk Then
  Run Side, Act & " tcm(2121) delay(0)" & Act
ElseIf LP = Desk And R="::|" & RP Then Run "/R=""" & R & """ /P=L", Key
ElseIf RP = Desk And L="::|" & LP Then Run "/L=""" & L & """ /P=R", Key
ElseIf LP = Desk And ListR.Exists(R) Then Run "/R=" & RM & " /P=L", Key
ElseIf RP = Desk And ListL.Exists(L) Then Run "/L=" & LM & " /P=R", Key
ElseIf LP = Desk Then Run "/P=L /R=" & RP & M & RO, Key
ElseIf RP = Desk Then Run "/P=R /L=" & LP & N & LO, Key
ElseIf ListR.Exists(R) And L="::|" & LP Then Param = "/L=""" & L & """ /R=""" & RM & """ " & Side
ElseIf ListL.Exists(L) And R="::|" & RP Then Param = "/L=""" & LM & """ /R=""" & R & """ " & Side
ElseIf ListL.Exists(L) And ListR.Exists(R) Then Param = "/L="""&LM&""" /R=""" & RM & """ " & Side
ElseIf ListL.Exists(L) Then Param = "/R=""" & R & M & RO & """ /L=""" & LM & """ " & Side
ElseIf ListR.Exists(R) Then Param = "/L=""" & L & N & LO & """ /R=""" & RM & """ " & Side
Else Param = "/L=""" & L & N & LO & """ /R=""" & R & M & RO & """ " & Side
End If : CreateObject("WScript.Shell").Run """%COMMANDER_EXE%"" " & Param
Прошу протестировать.
Последний раз редактировалось Flasher Чт фев 28, 2013 16:37, всего редактировалось 4 раза.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Flasher
Результат запуска с кнопки в TC x32 (на x64 пока не смотрел):

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

---------------------------
Windows Script Host
---------------------------
Сценарий:	C:\Totalcmd\Utils\Scripts\Reload3.vbs
Строка:	21
Символ:	3
Ошибка:	Индекс выходит за пределы допустимого диапазона: '[number: 1]'
Код:	800A0009
Источник: 	Ошибка выполнения Microsoft VBScript

---------------------------
ОК   
---------------------------
Причина — редирект секций [LeftHistory] и [RightHistory] из wincmd.ini в другой файл. При отключении редиректа этих секций перезапуск работает. Когда проверял более ранние версии этого скрипта с аналогичной функциональностью, было то же самое ограничение.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Avada
Ага, точно. Позже исправлю.
Про результаты тестов всё же имелись в виду все нюансы возврата, а не просто "работает". :wink:
И, кстати, функциональность нового не совсем аналогичная, в новом есть возможность возврата в виртуальный рабочий стол и установка курсора в нужной панели (в обычных папках - на нужном файле).
Последний раз редактировалось Flasher Вт фев 26, 2013 00:35, всего редактировалось 1 раз.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Flasher
Нюансы возврата проверю и, если надо, распишу подробно обязательно, но предпочёл бы это сделать после исправления проблемы с редиректом — мне так гораздо удобнее.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Avada
Ладно, сделал пока по-простому с указанием ini-файла с сециями истории. Надеюсь, обе секции у тебя в одном файле содержатся?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Flasher
В одном, разумеется. Мне для всех редиректов больше одного файла и не надо.
Протестировал пока на двух машинах с XP. Возможно, из нижеперечисленного не всё и должно работать, но тем не менее отмечу следующее.
Локальные каталоги — запоминается и папка, и позиция курсора.
Вкладки с частичным закреплением — тут проблем опять же не вижу ни по папке, ни по позиции курсора.
Виртуальные папки проверял те, для которых есть встроенные команды в TC. Не сохраняется папка "Шрифты" (открывается предыдущая открытая перед ней папка). Прочие папки сохраняются, но их открытие происходит с задержкой в несколько секунд (где-то поменьше, как в папке "Корзина", где-то побольше, как в папке "Рабочий стол").
Среди открытых псевдопапок FS-плагинов у некоторых содержимое сохраняется нормально, у некоторых папка переоткрывается пустой, но в основной массе вместо этого открывается корень диска C (tcPhonebook, например, даже выводит сообщение, что не может войти в соответствущую папку, и только потом переключается на корневой каталог системного диска).
В архивах (ZIP, RAR и др.) всё нормально сохраняется на верхнем уровне. Если открыто что-то глубже — после перезапуска открывается каталог, содержащий архив.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Avada
Спасибо за тест. В общем и целом всё верно.
В локальных папках должна запоминаться не одна позиция курсора, а обе, если они на файлах, конечно.
Про "Шрифты" писал ранее, тут ничего не исправишь.
Задержка на папке "рабочий стол" связано с переключением фокуса и вызовом внутренней команды ТС. Остальные должны быстрее открываться.
Про открытые псевдопапок в FS-плагинах понял, причина вроде на поверхности, но проблемного места пока не вижу.
Про глубину архивов и понятно. По-другому никак. В названии скрипта отмечено в части корней.
Есть ещё такой нюанс: если курсор установлен в обеих панелях на одном и том же файле или [..], то фокус будет слева. Это поправимо следующим образом: я могу в данный ini-файл писать дополнительную секцию и ключ с установкой значения 0/1 (активна правая/левая панель, соотв.). Если устроит, могу добавить.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Flasher писал(а):Это поправимо следующим образом: я могу в данный ini-файл писать дополнительную секцию и ключ с установкой значения 0/1 (активна правая/левая панель, соотв.). Если устроит, могу добавить.
Пока точно не знаю, хотелось бы попробовать такой вариант, а там уже решить, удобно это или нет. А вообще у меня при старте TC всегда активна правая панель...
Flasher писал(а):В локальных папках должна запоминаться не одна позиция курсора, а обе, если они на файлах, конечно.
Для неактивного курсора — не запоминается (но я его отображаю через TWinKey — это не может влиять?).
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Avada писал(а):А вообще у меня при старте TC всегда активна правая панель...
Имелось в виду, конечно, не слева, а в той панели, которая задана опционально при запуске ТС.
Поправил скрипт. По системным плагинам тоже. Обращаю внимание на параметры.
Avada писал(а):Для неактивного курсора — не запоминается (но я его отображаю через TWinKey — это не может влиять?).
Странно, проверил на трёх системах (2 ХР и 7) - везде запоминается. Твинки с выделением курсора в неактивной панели не влияет.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Flasher
Не работает.

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

---------------------------
Windows Script Host
---------------------------
Сценарий:	C:\Totalcmd\Utils\Scripts\Reload3_2.vbs
Строка:	24
Символ:	33
Ошибка:	Предполагается наличие окончания инструкции
Код:	800A0401
Источник: 	Ошибка компиляции Microsoft VBScript

---------------------------
ОК   
---------------------------
Flasher писал(а):Твинки с выделением курсора в неактивной панели не влияет.
Как выяснилось, влияет. Со стандартным неактивным курсором по предыдущей версии скрипта всё OK.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Avada
А путь к ini на свой исправил?
Avada писал(а):Как выяснилось, влияет.
Значит, влияет что-то другое, не выделение.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Flasher писал(а):А путь к ini на свой исправил?
Конечно, как и в предыдущем варианте.
Flasher писал(а):Значит, влияет что-то другое, не выделение.
Во всяком случае, если неактивный курсор задан опцией в TWinKey, его позиция не сохраняется, а если через настройки TC — сохраняется.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Avada писал(а):Строка:   24
А что у тебя на 24 строке? Должно быть HrIni = .ExpandEnvironmentStrings(HrIni).
Avada писал(а):если неактивный курсор задан опцией в TWinKey, его позиция не сохраняется
Я проверял, у меня работает. Если в twinkey.ini установить только эту одну опцию, аналогичное поведение?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Flasher писал(а):Если в twinkey.ini установить только эту одну опцию, аналогичное поведение?
Там одну только опцию установить не получится, надо ещё хотя бы цвет курсора задать. Но если это сделать — да, поведение аналогичное. Причём с и последней тестовой версией (4.2), и с последним релизом (1.105).
Flasher писал(а):Должно быть HrIni = .ExpandEnvironmentStrings(HrIni).
Да, но у меня это 21-я строка. На домашней машине ошибка указывает на 23-ю строку. Это HrIni & "`, Active, Left, 0)" "", 0, True. (На работе, видимо, пустая строка где-то в начале скрипта добавилась, потому что проблемная строка была по содержанию той же.)
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Avada писал(а):Причём с и последней тестовой версией (4.2)
А если, скажем, взять 3.72?

В части ошибки скрипт поправил (скопипастил сперва неисправленный вариант, а там всего-то кавычку через пробел переставить надо было).
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Ответить