Рестарт/перезапуск TC
Select messages from
# through # FAQ
[/[Print]\]

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

#1: Рестарт/перезапуск TC Author: ask-rusLocation: Russian Federation PostPosted: Thu Feb 21, 2013 16:43
    —
Какие способы перезапуска TC Вам известны, т.е. те, что можно повесить на кнопку? Решил собрать их в кучу, а после потестить. От себя, утилиты:
- kIT Universal Presets;
- Tinny TC Restarter.

#2:  Author: FlasherLocation: Москва PostPosted: Thu Feb 21, 2013 17:03
    —
Недавно обсуждали (есть ссылки).

#3:  Author: AvadaLocation: Россия, Саратов PostPosted: Thu Feb 21, 2013 17:06
    —
В дополнение к уже обсуждавшемуся:
• ReloadTC (не работает в 64-битной версии).
• TCIMG с параметром rstart.

#4:  Author: FlasherLocation: Москва PostPosted: Thu Feb 21, 2013 17:38
    —
Avada
Code:
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\Ultra TC Editors\History Editor.exe
/r
wcmicons.dll,80
Перезапуск ТС
Не хочет закрывать, открывает новую копию (а не должен). Баг?

#5:  Author: AvadaLocation: Россия, Саратов PostPosted: Thu Feb 21, 2013 18:18
    —
Flasher
Видимо, баг. Во всяком случае, описанию поведение не соответствует. И это не единственная проблема в пакете с перезапуском TC. Здесь на подробностях останавливаться не буду, но возьму всё это на заметку.

#6:  Author: ask-rusLocation: Russian Federation PostPosted: Fri Feb 22, 2013 11:21
    —
Avada wrote:
• TCIMG с параметром rstart.

Можно ссылку на него.

Опробовал Tinny TC Restarter с 64-битным TC - всё в норме.

#7:  Author: AvadaLocation: Россия, Саратов PostPosted: Fri Feb 22, 2013 12:03
    —
ask-rus
Ссылка
ask-rus wrote:
Опробовал Tinny TC Restarter с 64-битным TC - всё в норме.

Что ж, проверим. Дело в том, что мне некоторое время назад понадобилось универсальное решение, чтобы рестарт срабатывал из TC любой битности по одной и той же кнопке без лишних телодвижений. Перепробовал варианты с TCFS2, TCMC и TCIMG, пока самым простым и надёжным (в том числе при многократном выполнении нескольких рестартов подряд) оказался последний способ.

#8:  Author: MVVLocation: Ростов-Дон PostPosted: Fri Feb 22, 2013 14:01
    —
Для корректного наследования окружения разрядность рестартера должна совпадать с разрядностью тотала.

#9:  Author: LonerDLocation: Донецк PostPosted: Fri Feb 22, 2013 14:32
    —
MVV wrote:
Для корректного наследования окружения разрядность рестартера должна совпадать с разрядностью тотала.


Тогда корректных перезагружалок нет. Моя просьба о создании перезагружалки, которая бы корректно работала с 64-битным Тоталом.

#10:  Author: ask-rusLocation: Russian Federation PostPosted: Fri Feb 22, 2013 14:59
    —
TCIMG завершает процесс TC, но не запускает его. Я не нашёл, где можно было бы указать путь до TC. Неужели заносить утилиту на территорию TC является обязательным.

#11:  Author: FlasherLocation: Москва PostPosted: Fri Feb 22, 2013 15:09
    —
MVV wrote:
Для корректного наследования окружения разрядность рестартера должна совпадать с разрядностью тотала.
Т.е. ты хочешь сказать, что если я запущу скрипт с возвратом %COMMANDER_EXE% из 64-битного ТС, он вернёт мне путь к 32-х битного? Быть того не может..

И вообще, где факт сбора способов? Вижу только обсуждение, которое не раз поднималось..

#12:  Author: ask-rusLocation: Russian Federation PostPosted: Fri Feb 22, 2013 17:05
    —
NirCmd есть 64-битный, умеет закрывать, убивать и запускать приложение. Запустить и закрыть Калькулятор вот этим:
Code:
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\PLUGINS\Tools\NirCmd\nircmd.exe
exec show calc.exe wait 1000 closeprocess calc.exe
%COMMANDER_PATH%\TOTALCMD64.EXE,3
nircmd
%COMMANDER_PATH%\PLUGINS\Tools\NirCmd\

-1

у меня не получилось.

#13:  Author: MVVLocation: Ростов-Дон PostPosted: Fri Feb 22, 2013 17:13
    —
Flasher wrote:
Т.е. ты хочешь сказать, что если я запущу скрипт с возвратом %COMMANDER_EXE% из 64-битного ТС, он вернёт мне путь к 32-х битного? Быть того не может..

Окружение - это не только переменные тотала. И у 32- и 64-битных процессов окружения различаются. Взять ту же редирекцию. А с упомянутой тобой переменной всё будет работать, потому что сам тотал её установит, переопределив предыдущее значение.

#14:  Author: ask-rusLocation: Russian Federation PostPosted: Fri Feb 22, 2013 18:13
    —
Не будет ли чего худого, если создать 1 пользовательскую команду с помощью NirCmd для закрытия TC и 2 для запуска TC, а 3-ей командой с TCMC связать 1 и 2? Я боюсь, что, закрыв TC, продолжения не последует.

Добавлено спустя 9 минут:

Так и есть, глупая затея... Smile

#15:  Author: AvadaLocation: Россия, Саратов PostPosted: Fri Feb 22, 2013 18:24
    —
ask-rus wrote:
TCIMG завершает процесс TC, но не запускает его. Я не нашёл, где можно было бы указать путь до TC. Неужели заносить утилиту на территорию TC является обязательным.

TCIMG, как выяснилось при внимательном рассмотрении, завершает процесс TC любой битности, но запускает только 32-битный (у меня, напоминаю, комбинированная версия). В том числе и при нахождении в одном из подкаталогов TC. Я не нашёл никаких дополнительных параметров, позволяющих исправить ситуацию. Стало быть, для x64 в существующем виде это не годится.
Варианты с TCMC и TCFS2 этого недостатка не имеют, но у меня на одной из машин они странно работают: первый рестарт срабатывает, а последующие (сразу за первым) нет. Кроме того, там связка из двух em-команд, без которой хотелось бы обойтись.
Таким образом единственным средством, которое везде и всюду перезапускает именно то, что нужно, не требует дополнительных em-команд и при этом не глючит, оказался у меня Tinny TC Restarter. Команду (со своими именами и путями) использую такую:
%Commander_path%\Utils\TCRestarter\TinnyTCRestarter.exe 300 %Commander_EXE%

#16:  Author: ask-rusLocation: Russian Federation PostPosted: Fri Feb 22, 2013 18:39
    —
Хотелось бы что-нибудь посвежее, чем Tinny TC Restarter 2004 года. Автор в то время понятия не имел о 64-битной версии TC.
LonerD wrote:
Моя просьба о создании перезагружалки, которая бы корректно работала с 64-битным Тоталом.

Поддерживаю, за учётом нюансов с разрядностью, правами и др., если таковые имеются.

#17:  Author: FlasherLocation: Москва PostPosted: Fri Feb 22, 2013 18:51
    —
MVV wrote:
Окружение - это не только переменные тотала. И у 32- и 64-битных процессов окружения различаются. Взять ту же редирекцию. А с упомянутой тобой переменной всё будет работать, потому что сам тотал её установит, переопределив предыдущее значение.
Ну, а дальше то что? В чём проблема перезапуска, если есть переменная среды, которая и нужна для запуска нового экземляра?

#18:  Author: AvadaLocation: Россия, Саратов PostPosted: Fri Feb 22, 2013 19:13
    —
ask-rus wrote:
Хотелось бы что-нибудь посвежее, чем Tinny TC Restarter 2004 года. Автор в то время понятия не имел о 64-битной версии TC.

А какая разница, имел или нет, если утилита при надлежащих параметрах в x64 нормально работает? Что не так-то, кроме года выпуска?

#19:  Author: ask-rusLocation: Russian Federation PostPosted: Fri Feb 22, 2013 19:24
    —
Avada wrote:
А какая разница, имел или нет, если утилита при надлежащих параметрах в x64 нормально работает? Что не так-то, кроме года выпуска?

MVV наводит смуту, жду, чем всё закончится.

#20:  Author: ask-rusLocation: Russian Federation PostPosted: Sat Feb 23, 2013 13:55
    —
Avada wrote:
Команду (со своими именами и путями) использую такую:

%Commander_path%\Utils\TCRestarter\TinnyTCRestarter.exe 300 %Commander_EXE%

Значение 300 ты выбрал, исходя из того, что у тебя на автозагрузке? Я присвоил значение 0, с загрузкой 4 библиотек, 2 шрифтов и 1 утилиты. Перезапуск мгновенный, повторял раз 10-15, никаких проблем.

#21:  Author: AvadaLocation: Россия, Саратов PostPosted: Sat Feb 23, 2013 15:36
    —
ask-rus
Присвоил просто по аналогии с много лет использовавшимися настройками по умолчанию другой утилиты (ReloadTC). Так сказать, для подстраховки. Возможно, это и не столь обязательно, но чтобы убедиться, надо ещё погонять на разных машинах.

#22:  Author: ask-rusLocation: Russian Federation PostPosted: Mon Feb 25, 2013 12:05
    —
TinnyTCRestarter не понимает %COMMANDER_PATH% и %COMMANDER_EXE% в параметрах для TOTALCMD64.EXE, только полный или относительный пути.

Last edited by ask-rus on Mon Feb 25, 2013 12:15; edited 1 time in total

#23:  Author: jentoso PostPosted: Mon Feb 25, 2013 12:12
    —
ask-rus, я не пробовал, а если через autorun присвоить переменную для TC x64, сработает?

#24:  Author: ask-rusLocation: Russian Federation PostPosted: Mon Feb 25, 2013 12:20
    —
jentoso wrote:
я не пробовал, а если через autorun присвоить переменную для TC x64, сработает?

Тоже не пробовал, у меня 64-битный TC, не комбинированный, поэтому остановился на относительном пути:
Code:
[em_Restart]
button=
cmd=%COMMANDER_PATH%\PLUGINS\Tools\Tinny TC Restarter\TinnyTCRestarter.exe
param=300 ..\..\..\TOTALCMD64.EXE
menu=Перезапуск
path=%COMMANDER_PATH%\PLUGINS\Tools\Tinny TC Restarter\

#25:  Author: AvadaLocation: Россия, Саратов PostPosted: Mon Feb 25, 2013 13:51
    —
ask-rus wrote:
TinnyTCRestarter не понимает %COMMANDER_PATH% и %COMMANDER_EXE% в параметрах для TOTALCMD64.EXE

А нефиг их в поле "Параметры" указывать, только и всего. У меня всё необходимое указано в поле "Команда" (пример строки дан выше).

#26:  Author: ask-rusLocation: Russian Federation PostPosted: Mon Feb 25, 2013 16:08
    —
Avada wrote:
А нефиг их в поле "Параметры" указывать, только и всего.

Ага. Sad

#27:  Author: mrmerak PostPosted: Mon Feb 25, 2013 17:21
    —
Я вот такой способ использую
Code:
Set WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys("%{F4}")
WScript.Sleep 200
WshShell.Run "TOTALCMD.EXE"

#28:  Author: jentoso PostPosted: Mon Feb 25, 2013 17:29
    —
Mr.Merak, а какая разница скрипта с этим? (просто для себя)
Code:
w=WScript.CreateObject('WScript.Shell')
w.Run('%commander_path%\\totalcmd /o'),1,1
WScript.Sleep(100)
w.SendKeys('%{F4}')
WScript.Sleep(400)
w.Run('%commander_path%\\totalcmd')

#29:  Author: mrmerak PostPosted: Mon Feb 25, 2013 18:39
    —
jentoso
а хз, я сам где-то его скопипастил

#30:  Author: AvadaLocation: Россия, Саратов PostPosted: Mon Feb 25, 2013 19:26
    —
jentoso
Я могу сказать другое — что между ними общего. Оба скрипта не учитывают тот факт, что комбинацией Alt+F4 не обязательно выполняется закрытие окна TC (см., например, описание ключа MinimizeOnClose). В старом демо-скрипте, входящем в поставку Script Helper, привязка закрытия хотя бы делалась к встроенной команде... Возможно, кому-то эти нюансы (как и в случае с разной битностью экзешника TC) абсолютно не нужны, однако же универсальности, в отличие от кое-чего из предложенного ранее, тут нет.

#31:  Author: FlasherLocation: Москва PostPosted: Mon Feb 25, 2013 19:59
    —
Avada wrote:
в отличие от кое-чего из предложенного ранее
И от чего же? Я пока не увидел.
Вот как я вижу то, что ещё может приблизится к понятию удобства и универсальности:

Code:
'============================================================
' Перезапуск ТС с возвратом к открытым в корне архивам,
' разным элементам в частично заблокированных вкладках
' и виртуальным папкам 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

Прошу протестировать.


Last edited by Flasher on Thu Feb 28, 2013 16:37; edited 4 times in total

#32:  Author: AvadaLocation: Россия, Саратов PostPosted: Mon Feb 25, 2013 20:56
    —
Flasher
Результат запуска с кнопки в TC x32 (на x64 пока не смотрел):
Code:
---------------------------
Windows Script Host
---------------------------
Сценарий:   C:\Totalcmd\Utils\Scripts\Reload3.vbs
Строка:   21
Символ:   3
Ошибка:   Индекс выходит за пределы допустимого диапазона: '[number: 1]'
Код:   800A0009
Источник:    Ошибка выполнения Microsoft VBScript

---------------------------
ОК   
---------------------------

Причина — редирект секций [LeftHistory] и [RightHistory] из wincmd.ini в другой файл. При отключении редиректа этих секций перезапуск работает. Когда проверял более ранние версии этого скрипта с аналогичной функциональностью, было то же самое ограничение.

#33:  Author: FlasherLocation: Москва PostPosted: Mon Feb 25, 2013 21:46
    —
Avada
Ага, точно. Позже исправлю.
Про результаты тестов всё же имелись в виду все нюансы возврата, а не просто "работает". Wink
И, кстати, функциональность нового не совсем аналогичная, в новом есть возможность возврата в виртуальный рабочий стол и установка курсора в нужной панели (в обычных папках - на нужном файле).


Last edited by Flasher on Tue Feb 26, 2013 00:35; edited 1 time in total

#34:  Author: AvadaLocation: Россия, Саратов PostPosted: Mon Feb 25, 2013 22:51
    —
Flasher
Нюансы возврата проверю и, если надо, распишу подробно обязательно, но предпочёл бы это сделать после исправления проблемы с редиректом — мне так гораздо удобнее.

#35:  Author: FlasherLocation: Москва PostPosted: Mon Feb 25, 2013 23:30
    —
Avada
Ладно, сделал пока по-простому с указанием ini-файла с сециями истории. Надеюсь, обе секции у тебя в одном файле содержатся?

#36:  Author: AvadaLocation: Россия, Саратов PostPosted: Tue Feb 26, 2013 19:42
    —
Flasher
В одном, разумеется. Мне для всех редиректов больше одного файла и не надо.
Протестировал пока на двух машинах с XP. Возможно, из нижеперечисленного не всё и должно работать, но тем не менее отмечу следующее.
Локальные каталоги — запоминается и папка, и позиция курсора.
Вкладки с частичным закреплением — тут проблем опять же не вижу ни по папке, ни по позиции курсора.
Виртуальные папки проверял те, для которых есть встроенные команды в TC. Не сохраняется папка "Шрифты" (открывается предыдущая открытая перед ней папка). Прочие папки сохраняются, но их открытие происходит с задержкой в несколько секунд (где-то поменьше, как в папке "Корзина", где-то побольше, как в папке "Рабочий стол").
Среди открытых псевдопапок FS-плагинов у некоторых содержимое сохраняется нормально, у некоторых папка переоткрывается пустой, но в основной массе вместо этого открывается корень диска C (tcPhonebook, например, даже выводит сообщение, что не может войти в соответствущую папку, и только потом переключается на корневой каталог системного диска).
В архивах (ZIP, RAR и др.) всё нормально сохраняется на верхнем уровне. Если открыто что-то глубже — после перезапуска открывается каталог, содержащий архив.

#37:  Author: FlasherLocation: Москва PostPosted: Tue Feb 26, 2013 20:24
    —
Avada
Спасибо за тест. В общем и целом всё верно.
В локальных папках должна запоминаться не одна позиция курсора, а обе, если они на файлах, конечно.
Про "Шрифты" писал ранее, тут ничего не исправишь.
Задержка на папке "рабочий стол" связано с переключением фокуса и вызовом внутренней команды ТС. Остальные должны быстрее открываться.
Про открытые псевдопапок в FS-плагинах понял, причина вроде на поверхности, но проблемного места пока не вижу.
Про глубину архивов и понятно. По-другому никак. В названии скрипта отмечено в части корней.
Есть ещё такой нюанс: если курсор установлен в обеих панелях на одном и том же файле или [..], то фокус будет слева. Это поправимо следующим образом: я могу в данный ini-файл писать дополнительную секцию и ключ с установкой значения 0/1 (активна правая/левая панель, соотв.). Если устроит, могу добавить.

#38:  Author: AvadaLocation: Россия, Саратов PostPosted: Tue Feb 26, 2013 20:48
    —
Flasher wrote:
Это поправимо следующим образом: я могу в данный ini-файл писать дополнительную секцию и ключ с установкой значения 0/1 (активна правая/левая панель, соотв.). Если устроит, могу добавить.

Пока точно не знаю, хотелось бы попробовать такой вариант, а там уже решить, удобно это или нет. А вообще у меня при старте TC всегда активна правая панель...

Flasher wrote:
В локальных папках должна запоминаться не одна позиция курсора, а обе, если они на файлах, конечно.

Для неактивного курсора — не запоминается (но я его отображаю через TWinKey — это не может влиять?).

#39:  Author: FlasherLocation: Москва PostPosted: Wed Feb 27, 2013 13:59
    —
Avada wrote:
А вообще у меня при старте TC всегда активна правая панель...
Имелось в виду, конечно, не слева, а в той панели, которая задана опционально при запуске ТС.
Поправил скрипт. По системным плагинам тоже. Обращаю внимание на параметры.

Avada wrote:
Для неактивного курсора — не запоминается (но я его отображаю через TWinKey — это не может влиять?).
Странно, проверил на трёх системах (2 ХР и 7) - везде запоминается. Твинки с выделением курсора в неактивной панели не влияет.

#40:  Author: AvadaLocation: Россия, Саратов PostPosted: Wed Feb 27, 2013 15:09
    —
Flasher
Не работает.
Code:
---------------------------
Windows Script Host
---------------------------
Сценарий:   C:\Totalcmd\Utils\Scripts\Reload3_2.vbs
Строка:   24
Символ:   33
Ошибка:   Предполагается наличие окончания инструкции
Код:   800A0401
Источник:    Ошибка компиляции Microsoft VBScript

---------------------------
ОК   
---------------------------

Flasher wrote:
Твинки с выделением курсора в неактивной панели не влияет.

Как выяснилось, влияет. Со стандартным неактивным курсором по предыдущей версии скрипта всё OK.

#41:  Author: FlasherLocation: Москва PostPosted: Wed Feb 27, 2013 15:45
    —
Avada
А путь к ini на свой исправил?

Avada wrote:
Как выяснилось, влияет.
Значит, влияет что-то другое, не выделение.

#42:  Author: AvadaLocation: Россия, Саратов PostPosted: Wed Feb 27, 2013 17:03
    —
Flasher wrote:
А путь к ini на свой исправил?

Конечно, как и в предыдущем варианте.

Flasher wrote:
Значит, влияет что-то другое, не выделение.

Во всяком случае, если неактивный курсор задан опцией в TWinKey, его позиция не сохраняется, а если через настройки TC — сохраняется.

#43:  Author: FlasherLocation: Москва PostPosted: Wed Feb 27, 2013 18:34
    —
Avada wrote:
Строка:   24
А что у тебя на 24 строке? Должно быть HrIni = .ExpandEnvironmentStrings(HrIni).

Avada wrote:
если неактивный курсор задан опцией в TWinKey, его позиция не сохраняется
Я проверял, у меня работает. Если в twinkey.ini установить только эту одну опцию, аналогичное поведение?

#44:  Author: AvadaLocation: Россия, Саратов PostPosted: Wed Feb 27, 2013 19:49
    —
Flasher wrote:
Если в twinkey.ini установить только эту одну опцию, аналогичное поведение?

Там одну только опцию установить не получится, надо ещё хотя бы цвет курсора задать. Но если это сделать — да, поведение аналогичное. Причём с и последней тестовой версией (4.2), и с последним релизом (1.105).

Flasher wrote:
Должно быть HrIni = .ExpandEnvironmentStrings(HrIni).

Да, но у меня это 21-я строка. На домашней машине ошибка указывает на 23-ю строку. Это HrIni & "`, Active, Left, 0)" "", 0, True. (На работе, видимо, пустая строка где-то в начале скрипта добавилась, потому что проблемная строка была по содержанию той же.)

#45:  Author: FlasherLocation: Москва PostPosted: Wed Feb 27, 2013 21:49
    —
Avada wrote:
Причём с и последней тестовой версией (4.2)
А если, скажем, взять 3.72?

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

#46:  Author: AvadaLocation: Россия, Саратов PostPosted: Wed Feb 27, 2013 23:56
    —
Flasher
С TWinKey 3.72 всё то же самое, что и выше описано.
Исправленный скрипт выполняет перезапуск с выводом промежуточного окна:
Code:
---------------------------
TCFS2
---------------------------
Error:
Unavailable key

Macros:
L_isActive
---------------------------
ОК   
---------------------------

Но содержание псевдопапок FS-плагинов, да, теперь сохраняется.

#47:  Author: jentoso PostPosted: Thu Feb 28, 2013 00:35
    —
Avada, а почему такая старая версия TWinKey?

#48:  Author: FlasherLocation: Москва PostPosted: Thu Feb 28, 2013 01:48
    —
Avada
По ошибке ясно. Нужно бы обновить TCFS2, указанного макроса в ini не хватает. Ах, да, и должен быть загружен плагин TCFS2Tools.
С TWinKey уже и не знаю, что делать. Хорошо, если бы ещё кто-то проверил. Но я, судя по всему, уже ничего тут не смогу исправить.

#49:  Author: AvadaLocation: Россия, Саратов PostPosted: Thu Feb 28, 2013 08:36
    —
Flasher wrote:
Нужно бы обновить TCFS2, указанного макроса в ini не хватает. Ах, да, и должен быть загружен плагин TCFS2Tools.

Спасибо, разобрался (у меня INI-файл обновлён не был). Буду дальше проверять уже с новой версией скрипта.
Но, кстати, про необходимость применения версии TCFS2 не ниже такой-то и — особенно — автозагрузки TCFS2Tools неплохо бы упомянуть в шапке скрипта.

Flasher wrote:
С TWinKey уже и не знаю, что делать.

Ну и ладно пока. При наличии времени ещё попробую посмотреть, в чём может быть дело.

jentoso
Более новые версии проверялись на предыдущей странице. Там же был запрос на проверку конкретно в указанной, что я и сделал.

#50:  Author: FlasherLocation: Москва PostPosted: Thu Feb 28, 2013 09:29
    —
Avada wrote:
про необходимость применения версии TCFS2 не ниже такой-то и — особенно — автозагрузки TCFS2Tools неплохо бы упомянуть в шапке скрипта
Согласен. И видимо, ты при первых тестах не проверял условие, когда "Рабочий стол" в обеих панелях, иначе бы также на эту ошибку напоролся.
В общем, сперва протестим, и как будет ясно, что всё в порядке, дополню шапку.

#51:  Author: AvadaLocation: Россия, Саратов PostPosted: Thu Feb 28, 2013 12:03
    —
Flasher
По неактивным курсорам на всякий случай сообщаю следующее. Если такой курсор задан средствами и TC, и TWinKey, то, как известно, отображается всё вместе (например, пунктирная рамка плюс подчёркивание). И вот если при таких условиях выполнить перезапуск TC, например, через Tinny TC Restarter, курсор отобразится "комбинированным", но без сохранения позиции. А если через скрипт, то позиция сохранится, но там отобразится только стандартный вид курсора, а то, что задано в TWinKey, отобразится на первом элементе списка (то есть неактивных курсоров получится два). Единый "комбинированный" курсор опять появится, только если сделать затем неактивной другую панель.

#52:  Author: FlasherLocation: Москва PostPosted: Thu Feb 28, 2013 12:36
    —
Avada
Теперь ясно. Это чистый баг TwinKey. Попробуй выполнить команду:
%COMMANDER_EXE% /O /L="<путь к одному файлу>" /R="<путь к другому файлу>"
Будет раздвоение?
По остальному - всё в порядке?

#53:  Author: AvadaLocation: Россия, Саратов PostPosted: Thu Feb 28, 2013 15:30
    —
Flasher wrote:
Будет раздвоение?

Будет.
Flasher wrote:
По остальному - всё в порядке?

Пока больше ничего интересного не обнаружил. Но для надёжности надо погонять и на других машинах. Постараюсь сегодня успеть.

#54:  Author: FlasherLocation: Москва PostPosted: Thu Feb 28, 2013 16:38
    —
Avada wrote:
Будет.
Ага, значит, ещё есть что репортить автору.

Шапку дополнил и кое-где слегка оптимизировал.

#55:  Author: KopBuHLocation: Tashkent, Uzbekistan PostPosted: Thu Feb 28, 2013 17:42
    —
2ask-rus:
при подлюченном плагине Autorun, если создать внешнюю переменную, содержащую PID тотала, можно перезапускать ТС просто из командной строки (без использования внешних утилит, и если конфигом используется стандартный wincmd.ini в корне ТС):

Код Autorun:
Code:

SetEnv /EV COMMANDER_PID %AUTORUN_TCPID%

пользовательская команда:
Code:

[em_RestartTC]
button=TotalCmd.exe,35
cmd=%COMSPEC% /C
menu=Перезапуск Total Commander
param=ECHO OFF & TITLE Перезапуск TC... & (TASKKILL /PID %%COMMANDER_PID%% && START "Запуск TC" "%%commander_exe%%")
iconic=1

иконку нужно поставить свою.
как видно из кода, будет запущен именно тот файл ТС, который работает сейчас. то есть если сейчас запущен TotalCmd64.exe, то при успешном завершение процесса именно он и будет запущен.

P.S.: если PID неизвестен (будут закрыты все копии ТС запущенные от имени текущего пользователя):
Code:

button=TotalCmd.exe,35
cmd=%COMSPEC% /C
menu=Перезапуск Total Commander
param=ECHO OFF & TITLE Перезапуск TC... & (TASKKILL /FI "USERNAME eq %%USERNAME%%" /IM TotalCmd* && START "Запуск TC" "%%commander_exe%%")


Last edited by KopBuH on Thu Feb 28, 2013 18:05; edited 1 time in total

#56:  Author: FlasherLocation: Москва PostPosted: Thu Feb 28, 2013 17:58
    —
KopBuH
Чёрное окно, на котором, ко всему прочему, не успеваешь ничего прочесть, при перезапуске - это как кинжал в ногу. Smile

#57:  Author: KopBuHLocation: Tashkent, Uzbekistan PostPosted: Thu Feb 28, 2013 18:10
    —
Flasher wrote:
KopBuH
Чёрное окно, на котором, ко всему прочему, не успеваешь ничего прочесть, при перезапуске - это как кинжал в ногу. Smile

а зачем при перезапуске ТС что-то читать? Rolling Eyes
ведь командная строка запустится в свернутом виде, и с заголовком "Перезапуск ТС".
зато не требует никаких утилит типо tcimg и тому подобных.
и работает во всех версиях Windows (быть может за исключеним PE).

#58:  Author: FlasherLocation: Москва PostPosted: Thu Feb 28, 2013 18:25
    —
KopBuH wrote:
ведь командная строка запустится в свернутом виде, и с заголовком "Перезапуск ТС".
Не везде. У меня есть такая проблемка на одном XP, когда cmd срабатывает.
KopBuH wrote:
а зачем при перезапуске ТС что-то читать?
А зачем что-то писать, чтобы нельзя было прочесть? Very Happy
KopBuH wrote:
зато не требует никаких утилит типо tcimg и тому подобных.
Autorun тоже программа. Наличие мелких программ, особенно часто применяемых в последнее время, - не жертва.
KopBuH wrote:
и работает во всех версиях Windows
Достаточно не ниже XP. В этом случае много что тут работает.

#59:  Author: KopBuHLocation: Tashkent, Uzbekistan PostPosted: Thu Feb 28, 2013 18:50
    —
Flasher wrote:

KopBuH wrote:
зато не требует никаких утилит типо tcimg и тому подобных.
Autorun тоже программа. Наличие мелких программ, особенно часто применяемых в последнее время, - не жертва.

Бывает, иногда сижу я в ТС, запущенном из под сети.
и если мне нужно перезапустить его, то при запуске левой утилиты будет выдан запрос, и т.п. а командной строке ничего этого не нужно.
в постскриптуме я написал еще вариант, когда Autorun не используется.
и вообще: я лишь описал еще один способ (без внешних утилит). это противозаконно?.

#60:  Author: FlasherLocation: Москва PostPosted: Thu Feb 28, 2013 19:33
    —
KopBuH wrote:
и если мне нужно перезапустить его, то при запуске левой утилиты будет выдан запрос, и т.п. а командной строке ничего этого не нужно.
На мой скрипт ругается?

KopBuH wrote:
я лишь описал еще один способ (без внешних утилит). это противозаконно?.
В той же степени, в какой и мои замечания.
Для себя - пожалуйста. Но мы, как мне кажется, как-то больше тут разбираем методы, подходящие многим.
TCFS2 заточена под ТС, это не внешняя утилита.

#61:  Author: goraLocation: Иваново PostPosted: Thu Mar 07, 2013 10:54
    —
KopBuH
Ваш вариант не закрывает ТС, а убивает его процесс. При этом после запуска не сохраняться открытые перед "смертью" директории на панелях при повторном запуске, в отличии от закрытия ТС через посыл Alt+F4.

#62:  Author: LonerDLocation: Донецк PostPosted: Thu Mar 07, 2013 14:49
    —
Quote:
в отличии от закрытия ТС через посыл Alt+F4.

Поправка - через cm_Exit (ибо Alt+F4 не при всяких настройках закрывает ТС).

Quote:
не сохраняться открытые перед "смертью" директории

У меня сохраняет.

Quote:
KopBuH
Ваш вариант не закрывает ТС, а убивает его процесс.

Самое плохое - этот вариант не закрывает и не убивает процесс 32-х битного ТС под 64-битной Windows.
Непонятный нюанс. В предложенном варианте процесс не убивается (не найден PID) и новая копия Тотала не запускается. А вот если добавить вначале перед comspec скрытие консольных окон hidcon - запускается новая версия Тотала, но старая не убивается. Почему? Ещё не сталкивался чтобы скрыватель консоли так влиял на консольную команду.
И почему PID не находится? Taskill ведь может убивать 32-х битные процессы.


Last edited by LonerD on Thu Mar 07, 2013 16:29; edited 1 time in total

#63:  Author: AvadaLocation: Россия, Саратов PostPosted: Thu Mar 07, 2013 15:06
    —
gora
LonerD
Думаю, и до этого, и сейчас сказано уже достаточно, чтобы этот вариант в качестве рекомендуемого больше не рассматривать.

#64:  Author: LonerDLocation: Донецк PostPosted: Thu Mar 07, 2013 16:31
    —
Avada
А мне наоборот - вариан реализации кажется весьма интересным, но пока не полностью работоспособным.

Flasher
Если ещё актуально по скрипту.
Погонял под Win8x64, Тотал 32-х и 64-х битный, с последним TwinKey (курсор в неактивной панели в TwinKey отключен, в Тотале - включен).
Положение курсора сохраняется только на файлах, но не на каталогах. Внутри архивов положение курсора не сохраняется.
Если файлов в панели много и курсор находится не на первых файлах - то после перезапуска положение его сохраняется, но на экране он не виден, нужно крутнуть чуток вниз список файлов.

Если добавить в авторан активацию Virtual Panel
Code:
# Activate Virtual Panel Plugin
CommandExec /CD "\\\Virtual Panel"
Sleep 50
SendCommand cm_GotoPreviousDir

то при при положении курсора на правой панели после запуска открывается совсем не то, что ожидалось; при положении курсора на левой панели - положение курсора сохраняется через раз.

В целом даже без этих строк после нескольких десятков перезапусков было

#65:  Author: FlasherLocation: Москва PostPosted: Thu Mar 07, 2013 16:48
    —
LonerD wrote:
Если ещё актуально по скрипту.
А где я отменял актуальность? Smile Это Avada написал, что погоняет на других машинах, но так, по всей видимости, и не погонял..

LonerD wrote:
Положение курсора сохраняется только на файлах, но не на каталогах.
Единственное, что можно делать, чтобы оставлять курсор на папках, это входить и выходить из них (причём менять фокус, если папки в обеих панелях). Сомневаюсь, что тебе такое понравится, да и остальным тоже.

LonerD wrote:
Внутри архивов положение курсора не сохраняется.
Знаю, не предусмотрено ТС. Только фокус активности сохраняется (это тоже в какой-то мере положение).

LonerD wrote:
но на экране он не виден, нужно крутнуть чуток вниз список файлов.
Крутить ничего не надо, достаточно воспользоваться одинарным нажатием вверх/вниз.

LonerD wrote:
Если добавить в авторан активацию...
на левой панели - положение курсора сохраняется через раз
Ещё бы. Кто последний, тот и водит. Либо скрипт, либо Autorun.
Как вариант - ставить решётку в autorun.cfg перед указанной командой. Но это уже для твоего частного случая.

#66:  Author: AvadaLocation: Россия, Саратов PostPosted: Thu Mar 07, 2013 18:08
    —
Flasher wrote:
Это Avada написал, что погоняет на других машинах, но так, по всей видимости, и не погонял..

Подробный анализ требует времени, которого у меня пока в достаточном количестве нет. Кое-что, впрочем, сообщить могу.
Упоминавшаяся уже утилита ReloadTC, да, не работает в 64-битном TC, но зато обладает одним весьма ценным качеством, которого я у конкурентов не наблюдаю. Поясню на примере.
Допустим, у нас есть TC, который в норме запускается без всяких специальных параметров, с подхватыванием INI-файла, лежащего в папке TC. Допустим также, что предусмотрен вызов (в том числе через ярлык) того же самого TC с минимальными настройками, близкими у умолчальным. Для такого тестового запуска значениями параметров /I и /F указаны другие INI-файлы.
Итак, ярлыком запускается (с параметрами) тестовая версия TC. Создадим там кнопку для перезапуска. Если в ней используется ReloadTC, он именно этот самый TC с этими самыми параметрами опять и перезапустит. Если используются средства, где указана переменная %Commander_EXE%, после закрытия окна тестового TC запущен будет другой, полнофункциональный вариант той же копии TC (тот же экзешник, но без параметров и, следовательно, с другими INI-файлами). И скрипт, и Tinny TC Restarter работают именно так.
Интересно, можно ли тут совместить обе полезности?
На форуме проблема анализа командной строки поднималась, к примеру, здесь, но это было очень давно. Что с тех пор изменилось? Что можно сделать сейчас при запуске утилиты/скрипта из текущей копии TC? Для основного файла настроек есть переменная %COMMANDER_INI%. Для настроек FTP аналога нет, но этим в первом приближении пока что можно пренебречь.

#67:  Author: FlasherLocation: Москва PostPosted: Thu Mar 07, 2013 18:36
    —
Avada wrote:
ReloadTC, он именно этот самый TC с этими самыми параметрами опять и перезапустит.
"Этот самый" он запустить никак не может, он аналогично создаёт новый процесс, ибо старый уже был захлопнут.
Avada wrote:
%Commander_EXE%, после закрытия окна тестового TC запущен будет другой, полнофункциональный вариант той же копии TC (тот же экзешник, но без параметров и, следовательно, с другими INI-файлами). И скрипт, и Tinny TC Restarter работают именно так.
В моём случае не без параметров, а с параметрами, но не теми, с какими был запущен Тотал через ярлык.
Avada wrote:
можно ли тут совместить обе полезности?
Совмещение противоречит сути возврата, т.к. ТС запускается с определёнными параметрами /L= /R= /P=L/R, которые также могут фигурировать в активном ТС.
Если речь идёт только об /I и /F, то, в принципе, их вытащить и подставить в комстроку можно, только в данном случае PID из Auotorun точно потребуется.

#68:  Author: AvadaLocation: Россия, Саратов PostPosted: Thu Mar 07, 2013 18:41
    —
Flasher wrote:
Если речь идёт только об /I и /F, то, в принципе, из вытащить и подставить в комстроку можно, только в данном случае PID из Auotorun точно потребуется.

Да, речь идёт только об этом.

#69:  Author: LonerDLocation: Донецк PostPosted: Thu Mar 07, 2013 23:45
    —
Flasher
Quote:
А где я отменял актуальность?

Нигде.

Quote:
Сомневаюсь, что тебе такое понравится, да и остальным тоже.

Тоже сомневаюсь. Тогда для себя не вижу смысла в использовании скрипта. Crying or Very sad Желаемый результат с ним получается не всегда - не будешь же каждый раз следить где находится курсор (на файле или на каталоге) при перезапуске.

#70:  Author: FlasherLocation: Москва PostPosted: Fri Mar 08, 2013 01:15
    —
Avada
Ясно. Сделать - сделаю, но вот только не знаю, как быть - править старый пост или запостить MIME?

LonerD
Весьма странная попытка увидеть смысл использования только там, где всё без исключения работает. Может, и от ТС откажешься? Wink
Любой иной перезапуск тебе такого возврата не сделает. Утеривать текущие позиции (в архивах, в системных плагинах, в виртуальных папках, в заблокированных вкладках) лично мне никакого удовольствия после перезапуска, которым я частенько пользуюсь, не доставляет. Если тебе доставляет, не вопрос, юзай простейшие варианты (уже давно мне неинтересные). Суть скрипта прежде всего в запоминании открытых псевдо/папок, мысль о позиции курсора на файлах возникла сравнительно недавно.

#71:  Author: LonerDLocation: Донецк PostPosted: Fri Mar 08, 2013 03:46
    —
Flasher
Quote:
Может, и от ТС откажешься?

Нет.

Quote:
перезапуска, которым я частенько пользуюсь

У меня Тотал иногда сутки и более не закрывается и не перезапускается.

Quote:
Суть скрипта прежде всего в запоминании открытых псевдо/папок, мысль о позиции курсора на файлах возникла сравнительно недавно.

Мне до твоего скрипта ни одна ни вторая мысль даже не приходили, потому пока не осознал все удобства этого метода. Smile

Quote:
Единственное, что можно делать, чтобы оставлять курсор на папках, это входить и выходить из них (причём менять фокус, если папки в обеих панелях). Сомневаюсь, что тебе такое понравится, да и остальным тоже....
Тоже сомневаюсь.

PS. Уже не так сомневаюсь.
Я ведь твоим скриптом перехода к закладкам (в том числе если закладка стоит на папке) пользуюсь - нравится Laughing

#72:  Author: AvadaLocation: Россия, Саратов PostPosted: Fri Mar 08, 2013 10:04
    —
Flasher wrote:
Ясно. Сделать - сделаю, но вот только не знаю, как быть - править старый пост или запостить MIME?

Мне, честно говоря, без особой разницы. Ну, пускай MIME будет.

#73:  Author: FlasherLocation: Москва PostPosted: Fri Mar 08, 2013 18:11
    —
LonerD wrote:
Мне до твоего скрипта ни одна ни вторая мысль даже не приходили, потому пока не осознал все удобства этого метода.
Наверно, частично заблокированными вкладками вообще не пользуешься и в архивы почти не заходишь. Если бы пользовался, сразу понял бы всю соль, ибо перезапускать при перенастройках ТС (автозагрузки, плагинов) просто необходимо. Перезапуски также требуются при перезаполнении памяти, багах и висах.
LonerD wrote:
Я ведь твоим скриптом перехода к закладкам (в том числе если закладка стоит на папке) пользуюсь - нравится
Я не думаю, что поведение будет аналогичное, как и при активном окне ТС. Не пробовал ещё блокировать окно только при его появлении. Могут быть артефакты, и некоторая задержка добавится. Ладно, посмотрю, как можно грамотней реализовать. Если получится криво, то выкладывать не буду.

Avada
Собственно, обойдусь без Autorun-a, так что можно и обновить.
Такой вопрос. На данный момент мы задаём ini в отдельной переменной. А что если в ini-файле, задаваемым через ключ, нет редиректа, или он ведёт на другой ini-файл с историей?
И как ведёт себя ReloadTC, если писать к файлам конфигурации не путь целиком, а только имя файла?
P.S. И не пора бы уже тему, прямо касаемую автоматизации, перенести в нужный подфорум?

#74:  Author: AvadaLocation: Россия, Саратов PostPosted: Fri Mar 08, 2013 20:15
    —
Flasher wrote:
На данный момент мы задаём ini в отдельной переменной. А что если в ini-файле, задаваемым через ключ, нет редиректа, или он ведёт на другой ini-файл с историей?

В моём случае — именно что нет. Да, такие варианты надо учесть.

Flasher wrote:
И как ведёт себя ReloadTC, если писать к файлам конфигурации не путь целиком, а только имя файла?

Я, конечно, могу проверить специально, но у меня в параметрах TC указывается не только другое имя, но и другой путь (вообще на другом диске).
Кстати, у ReloadTC могут быть собственные параметры, в том числе и для INI-файлов. Если они используются (у меня — нет), то подменяют стандартные (это есть в документации утилиты).

Flasher wrote:
И не пора бы уже тему, прямо касаемую автоматизации, перенести в нужный подфорум?

Безусловно, пора, и я это делаю. Общая тема по перезапуску TC необходима, но её действительно логично и правильно держать в "Автоматизации".

#75:  Author: StrekLocation: Светая Русь PostPosted: Tue Mar 12, 2013 18:45
    —
У меня exe-шка на AutoIt, с таким кодом:
Code:

Global $title

if processexists("TOTALCMD64.EXE") then
    $title = _Process2Win("TOTALCMD64.EXE")
    WinClose($title)
    Run("Путь к папке\TOTALCMD.exe")
elseIf processexists("TOTALCMD.EXE") then
    $title = _Process2Win("TOTALCMD.EXE")
    WinClose($title)
    Run("Путь к папке\TOTALCMD64.exe /i="Путь к папке\WinCmd64.ini")
endif

func _Process2Win($pid)
    if isstring($pid) then $pid = processexists($pid)
    if $pid = 0 then return -1
    $list = WinList()
    for $i = 1 to $list[0][0]
        if $list[$i][0] <> "" AND BitAnd(WinGetState($list[$i][1]),2) then
            $wpid = WinGetProcess($list[$i][0])
            if $wpid = $pid then return $list[$i][0]
        EndIf
    next
    return -1
endfunc


Источник AutoIt-Script.Ru

#76:  Author: mrmerak PostPosted: Fri Oct 18, 2013 15:05
    —
Народ, а кто может мой простенький vbs-скрипт переделать, чтобы он был универсальный для х32 и х64

Code:
Set WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys("%{F4}")
WScript.Sleep 400
WshShell.Run "TOTALCMD.EXE"

#77:  Author: Skif_off PostPosted: Fri Oct 18, 2013 19:24
    —
Strek wrote:
У меня exe-шка на AutoIt, с таким кодом:

В выложенном примере из х64 ТС запускается х32 и наоборот. А зачем полные пути, если можно поместить файл в корень папки ТС и использовать относительные пути Run(@ScriptDir & "\TOTALCMD.EXE") для портативности?

#78:  Author: StrekLocation: Светая Русь PostPosted: Fri Oct 18, 2013 20:04
    —
Skif_off wrote:
использовать относительные пути Run(@ScriptDir & "\TOTALCMD.EXE") для портативности?

Согласен. Просто пока не было нужды в портативности. Но за совет спасибо.

#79:  Author: Serge Yolkin PostPosted: Fri Oct 18, 2013 21:15
    —
mrmerak
%COMMANDER_EXE% ?

Добавлено спустя 54 минуты:

На JS будет так:
Code:
var
 s=new ActiveXObject('WScript.Shell'),
 t=s.ExpandEnvironmentStrings('%COMMANDER_EXE%');
s.SendKeys('%{F4}');
WScript.Sleep(2000);
s.Exec(t);
//s.Exec(t+' "'+WScript.Arguments(0)+'" "'+WScript.Arguments(1)+'"');
// это - если передавать скрипту %X "%Z%P" "%Z%T"
на бейсике примерно также, но я его дня три изучаю.

Добавлено спустя 18 минут:

или ещё короче:
Code:
with(new ActiveXObject('WScript.Shell')){
  sendKeys('%{F4}');
  WScript.Sleep(2000);
  exec(expandEnvironmentStrings('%COMMANDER_EXE%'));
  // exec(expandEnvironmentStrings('%COMMANDER_EXE%')+' "'+
  //  WScript.Arguments(0)+'" "'+WScript.Arguments(1)+'"');
}

#80:  Author: mrmerak PostPosted: Sat Oct 19, 2013 10:35
    —
Serge Yolkin
работает!

#81:  Author: Serge Yolkin PostPosted: Sat Oct 19, 2013 17:55
    —
mrmerak
Знаю Smile

#82:  Author: Skif_off PostPosted: Sun Jul 13, 2014 14:44
    —
Strek
Нет ли проблем при перезапуске? Использую нескомпилированный скрипт (дополненный) - иногда нажимаю, ТС закрывается, но новая копия не открывается. Наверное, надо прикручивать проверку.

#83:  Author: mrmerak PostPosted: Sun Jul 13, 2014 15:22
    —
Skif_off
я на TCIMG.exe rstart перешол

#84:  Author: Skif_off PostPosted: Sun Jul 13, 2014 17:05
    —
mrmerak
Помимо перезапуска еще кое-какие действия повесил, TCIMG недостаточно (ну и мнение по ней пока не сформулировал).

#85:  Author: goraLocation: Иваново PostPosted: Thu Jul 17, 2014 07:51
    —
Skif_off wrote:
Strek
Нет ли проблем при перезапуске? Использую нескомпилированный скрипт (дополненный) - иногда нажимаю, ТС закрывается, но новая копия не открывается. Наверное, надо прикручивать проверку.
После посыла команды закрытия окна нужно делать задержку (0.2...1.0 сек) перед следующим запуском ТС

Попробуйте, может будет понадежнее:
Code:
' Папки разных TC, у меня папки разные
TC64 = "E:\totalcmd64\TOTALCMD64.EXE"
TC86 = "E:\totalcmd86\Totalcmd.exe"

Set WSS = CreateObject("Wscript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colProcess86 = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & FSO.GetFileName(TC86) & "'")
Set colProcess64 = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & FSO.GetFileName(TC64) & "'")

' MsgBox "TC x86 = " & colProcess86.Count & vbLF & "TC x64 = " & colProcess64.Count, 64, "Info"

' Если есть запущенные процессы TC x86, то все их закрываем (а не убиваем)
' и запускаем один новый процесс TC x86
Restart TC86, colProcess86
' Если есть запущенные процессы TC x64, то все их закрываем (а не убиваем)
' и запускаем один новый процесс TC x64
Restart TC64, colProcess64
WScript.Quit

Sub Restart(ts, colProcessList)
   If colProcessList.Count <> 0 Then
      For Each objProcess in colProcessList
         WScript.Sleep 100
         WSS.Run "taskkill /PID " & objProcess.ProcessID, 0
      Next
      WScript.Sleep 400
      WSS.Run "" & ts & ""
      WScript.Sleep 400
   End If
End Sub

#86:  Author: FlasherLocation: Москва PostPosted: Thu Jul 17, 2014 14:12
    —
gora wrote:
Code:
Если есть запущенные процессы TC x-/-, то все их закрываем
Сомнительная задачка. К чему она?
gora wrote:
Code:
Where Name = '" & FSO.GetFileName(TC86) & "'"
И если exe какой-то копии переименован, тады чего?

#87:  Author: goraLocation: Иваново PostPosted: Thu Jul 17, 2014 17:19
    —
Flasher wrote:
gora wrote:
Code:
Если есть запущенные процессы TC x-/-, то все их закрываем
Сомнительная задачка. К чему она?

Это цитата не из меня. У меня там очень точно, мухи отдельно, котлеты отдельно. Постарайтесь цитировать без искажений о обобщений.
Flasher wrote:
gora wrote:
Code:
Where Name = '" & FSO.GetFileName(TC86) & "'"
И если exe какой-то копии переименован, тады чего?
Тут важно читать следующее:
gora wrote:
Папки разных TC, у меня папки разные

1 И ни какие общие варианты я не рассматривал.
2 Я отвечал Skif_off, который обсуждал код из поста, где имена и пути заданы абсолютными. Smile

#88:  Author: Skif_off PostPosted: Thu Jul 17, 2014 18:57
    —
gora wrote:
После посыла команды закрытия окна нужно делать задержку (0.2...1.0 сек) перед следующим запуском ТС

Почти сразу добавил Sleep(500).

gora wrote:
Попробуйте, может будет понадежнее

taskkill /PID - не очень корректно Smile

#89:  Author: goraLocation: Иваново PostPosted: Thu Jul 17, 2014 19:42
    —
Skif_off wrote:
taskkill /PID - не очень корректно

Чем?

#90:  Author: FlasherLocation: Москва PostPosted: Thu Jul 17, 2014 19:51
    —
gora wrote:
Это цитата не из меня. У меня там очень точно, мухи отдельно, котлеты отдельно. Постарайтесь цитировать без искажений о обобщений.
Раз про точность заговорили, "не из меня" или "не из моего кода"? "о обобщений" - это как?
В коде две строки. Мне их дважды предлагается повторить? Или лаконичность тут отменили?
gora wrote:
Тут важно читать следующее:
Это я прочёл сразу, суть моего вопроса от этого не пострадала.
gora wrote:
1 И ни какие общие варианты я не рассматривал.
Да ну? А перебор в цикле с завершением всех запущенных процессов с тем же именем?

#91:  Author: goraLocation: Иваново PostPosted: Thu Jul 17, 2014 20:02
    —
Flasher
Ну если Вы не хотите уточнить свой вопрос, то мне ответить нечего, ибо я его не понял.
Flasher wrote:
Да ну? А перебор в цикле с завершением всех запущенных процессов с тем же именем?

Это я тоже не понял. В чем упрек?
А вообще конкурировать с Вами в скриптописательстве я не собираюсь. Давайте замнем и забудем мой код. Я его ни кому не навязываю и не утверждаю, что он "лучше чем...". Хорошо?

#92:  Author: FlasherLocation: Москва PostPosted: Thu Jul 17, 2014 20:30
    —
gora wrote:
Ну если Вы не хотите уточнить свой вопрос, то мне ответить нечего, ибо я его не понял.
Я бы уточнил, если бы понял, что уточнять. Какой вопрос остался непонятым?
gora wrote:
Это я тоже не понял. В чем упрек?
В общности данного перебора:
gora wrote:
Code:
      For Each objProcess in colProcessList
         WScript.Sleep 100
         WSS.Run "taskkill /PID " & objProcess.ProcessID, 0
      Next
Сюда попадают все процессы с именами безотносительно указанных в начале кода путей.
gora wrote:
Хорошо?
А разобраться или доработать неинтересно? Smile

#93:  Author: goraLocation: Иваново PostPosted: Thu Jul 17, 2014 20:43
    —
Flasher wrote:
А разобраться или доработать неинтересно?

Не-а
gora wrote:
Давайте замнем и забудем мой код

#94:  Author: FlasherLocation: Москва PostPosted: Thu Jul 17, 2014 20:49
    —
ОК. Уже. Very Happy

#95:  Author: Skif_off PostPosted: Thu Jul 17, 2014 21:20
    —
gora wrote:
Skif_off wrote:
taskkill /PID - не очень корректно

Чем?

Штатно программы закрываем крестиком/Alt+F4, прибивать как-то нехорошо Smile

#96:  Author: goraLocation: Иваново PostPosted: Thu Jul 17, 2014 21:29
    —
Skif_off wrote:
прибивать как-то нехорошо

Я в комментариях написал, что процесс не убивается, а закрывается.
Команда taskkill /PID будет убивать в комплекте с ключом /F.
Можете проверить. В последнем случае папки, открытые в панелях после запуска ТС не будут сохраняться при перезапуске ТС, а без ключа /F идет закрытие равнозначное нажатию на красный крест в заголовке окна ТС.

#97:  Author: Skif_off PostPosted: Fri Jul 18, 2014 11:16
    —
gora
Всегда думал, что taskkill - то же самое, что Завершить процесс, а taskkill /f - Завершить дерево.

#98:  Author: goraLocation: Иваново PostPosted: Fri Jul 18, 2014 11:25
    —
Skif_off wrote:
taskkill /f - Завершить дерево.

Нет.
Quote:
/F Принудительное завершение процесса
/T Завершение указанного процесса и всех его дочерних процессов.

Подробности taskkill /?

#99:  Author: Skif_off PostPosted: Wed Sep 03, 2014 01:38
    —
Кто пользуется скриптом AutoIt или модификацией, обратите внимание: кажется, решена проблема определения нужной копии при нескольких запущенных ТС.

Добавлено спустя 50 минут:

Тысяча чертей Smile Всплыла другая проблема: при перезапуске с админскими правами ("*" в начале команды или меню ПКМ) получается болт, т.к. переменные окружения не наследуются.
Надо думать. Или передать параметром при старте скрипта, или воспользоваться nircmd elevate

Добавлено спустя много, 2014.09.12:

По ссылке выше есть диалог с gora, уточнение для повышения скорости работы и пара предположений, потенциально упрощающих работу и, главное - перезапуск с повышением прав. Попутное закрытие дочерних окон отдельных поиска и синхронизации вроде получилось, если кому интересно.

#100:  Author: Skif_off PostPosted: Tue Oct 14, 2014 17:28
    —
Исправленный и окончательный вариант на AutoIt, гарантированная работа с несколькими запущенными копиями ТС, возможно закрытие дочерних окон отдельных поиска и синхронизации.

Есть мысль прикрутить возможность парсить командную строку на предмет /i=имя.ini, но пока борюсь Smile

#101:  Author: Skif_off PostPosted: Tue Dec 30, 2014 14:13
    —
Поясните, пожалуйста, логику работы скрипта перезапуска:
1. Если ТС запущен с параметрами, при перезапуске нужно сохранить все или только /i= и /f=?

Добавлено спустя 5 минут:

2. В справке указано
Code:
TOTALCMD.EXE /i=wincmd.ini /f=wcx_ftp.ini

но реально сработает любой вариант:
Code:
TOTALCMD.EXE /i=wincmd.ini  f=wcx_ftp.ini
TOTALCMD.EXE  i=wincmd.ini /f=wcx_ftp.ini
TOTALCMD.EXE  i=wincmd.ini  f=wcx_ftp.ini

Это баг? Учитывать или надеятся, что все будут делать по справке?

#102:  Author: FlasherLocation: Москва PostPosted: Tue Dec 30, 2014 17:01
    —
Skif_off
1. Только, конечно.
2. Ух ты. А я и не знал. Видимо, Гислер косую черту не ищет при парсинге. Пойду проверю.

#103:  Author: Skif_off PostPosted: Wed Dec 31, 2014 11:28
    —
Думаю, второй вариант скрипта не тянет на публичный, т.к использование WinAPI накладывает определённые ограничения... Сразу не сообразил, т.к. у меня поддержка AutoIt (что забавно - отчасти и в рассчёте на подобные случаи) реализована с помощью плагина AutoRun:
Code:

If %AUTORUN_TCARCH% = 32 Then
  SetEnv /EV AutoIt %COMMANDER_PATH%\AutoIt3.exe
Else
  SetEnv /EV AutoIt %COMMANDER_PATH%\AutoIt3_x64.exe
EndIf


З.Ы. У выложенного выше Исправленный и окончательный вариант на AutoIt мне не нравилась необходимость дописывать в команду "%COMMANDER_EXE%", сейчас могу убрать (исходя из предположения, что скрипт будет лежать рядом с %COMMANDER_EXE%), но это добавит функцию строк на 20. Или ладно с ним?

#104:  Author: addhaloka PostPosted: Thu Aug 27, 2015 14:56
    —
ask-rus wrote:
Опробовал Tinny TC Restarter с 64-битным TC - всё в норме.

Пришлось его пропатчить, чтобы правильно работал с Impomezia TC Color Presets и 64-битным TC, т. е. чтобы restarttc.exe перезапускал по умолчанию TOTALCMD64.EXE, а не TOTALCMD.EXE.
На этом поначалу и остановился - в 32-битной сборке использую оригинальный, в 64-х - пропатченный - всё прекрасно. Very Happy Но тут, на досуге решил сделать сборку 32-64 - сразу же возник вопрос - как Tinny TC Restarter задействовать в ней? Нашёл решение (костыль конечно, но меня устраивает): переименовал оригинальный restarttc.exe в restarttc32.exe, а пропатченный для x64, соответственно в restarttc64.exe, для их запуска написал лаунчер, который запускает соответствующий рестартер в зависимости от того, из какого TC (32/64) вызван. Вроде нормально работает и с TC, и с TC Color Presets.
Если кого интересует, вышеописанное с исходником:
http://rghost.ru/private/6TZXTcJNR/adf14405d977836c9adb28e566ef2e6c

#105:  Author: addhaloka PostPosted: Sat Jul 08, 2017 04:47
    —
Quote:
Но тут, на досуге решил сделать сборку 32-64 - сразу же возник вопрос - как Tinny TC Restarter задействовать в ней? Нашёл решение (костыль конечно, но меня устраивает): переименовал оригинальный restarttc.exe в restarttc32.exe, а пропатченный для x64, соответственно в restarttc64.exe, для их запуска написал лаунчер, который запускает соответствующий рестартер в зависимости от того, из какого TC (32/64) вызван. Вроде нормально работает и с TC, и с TC Color Presets.

Для TC Color Presets 0.1.1.7 патч больше не нужен, и для Тотала он не обязателен, как уже понял - однако всё-равно оставил патченный вариант, как более универсальный, чтобы не плодить лишние команды в сборке 32-64 или не использовать Autorun.wdx.
Но, с Tinny TC Restarter уже начал бесить один момент - он почему-то всегда запускает TC, даже если нажать "Нет" в этом окне. Sad
С restartTC_Fasm и ReloadTC такого безобразия нет.
Больше всего нравится restartTC_Fasm отсюда, но он не работает на Win 8.1 (возможно, на Vista/Win 7 тоже). Оригинальный вообще не запускался на 8.1 - это я поправил, а вот дальше затык - процесс Тотала пришибается, а новый не создаётся. Буду пытаться разобраться.
Пока что перешёл на ReloadTC - пропатчил аналогично, как Tinny TC Restarter - вроде нормально работает. Плюс сделал доп. патч - заменил в импорте msvbvm50.dll на msvbvm60.dll (чтобы не плодить доп. библиотеки - msvbvm60.dll уже используется для TweakTC.
Вот набор, если кому надо: https://www.upload.ee/files/7203097/util_reloadtc_1_1_mod.7z.html
Если TC только x32, то может пригодится patched_msvbvm60\ReloadTC32.exe*, если же только x64, то ReloadTC64.exe* из patched / patched_msvbvm60.

* Переименуйте в это случае в ReloadTC.exe.

Если сборка 32-64, то используйте все 3 exe, ReloadTC.exe в данном случае лаунчер, по типу, как в пред. посте для Tinny TC Restarter.

p.s. msvbvm50/60, разумеется должна находится рядом с ReloadTC или в %PATH%.

#106:  Author: addhaloka PostPosted: Mon Jul 10, 2017 14:35
    —
Quote:
Больше всего нравится restartTC_Fasm отсюда, но он не работает на Win 8.1 (возможно, на Vista/Win 7 тоже). Оригинальный вообще не запускался на 8.1 - это я поправил, а вот дальше затык - процесс Тотала пришибается, а новый не создаётся. Буду пытаться разобраться.

Проблема в ReadProcessMemory - на осях выше XP как-то не так работает.
Кстати, благодаря такому способу получения данных о процессе TC restartTC_Fasm обладает уникальной фичей, отсутствующей у Tinny TC Restarter или ReloadTC - если TC был запущен с параметрами, то при перезапуске они сохраняются.
Пока не разобрался с ReadProcessMemory (впрочем, ещё даже не начинал Very Happy ), сделал простой вариант, без главной фичи, но на мой взгляд не хуже других рестартеров + минимализм - код макс. упрощён, в итоге exeшник весит всего 1 Кб.
Если кого интересует, вот с исходником: https://www.upload.ee/files/7211508/restartTC_Fasm_simplified.7z.html

upd. Немного поправил код, перезалил.

#107:  Author: addhaloka PostPosted: Wed Aug 09, 2017 15:01
    —
Разобрался с уникальной фичей (спасибо ManHunter за статью). Very Happy Правда, есть некоторые сомнения:
 Hidden text

#108:  Author: Duremar PostPosted: Sun Feb 10, 2019 02:44
    —
Avada wrote:

Таким образом единственным средством, которое везде и всюду перезапускает именно то, что нужно, не требует дополнительных em-команд и при этом не глючит, оказался у меня Tinny TC Restarter. Команду (со своими именами и путями) использую такую:
%Commander_path%\Utils\TCRestarter\TinnyTCRestarter.exe 300 %Commander_EXE%

Если я правильно понял, должны разрядности меняться, но у меня одна и таже каждый раз загружается. Или же, на последних версиях тотала, этот способ уже не работает?

#109:  Author: AvadaLocation: Россия, Саратов PostPosted: Sun Feb 10, 2019 09:20
    —
Duremar
Если это выполнено из 32-битного TC, он и будет перезапущен. Если из 64-битного — перезапускается он. Только об этом речь и шла. У меня этот способ сохраняется как резервный, постоянно я давно уже пользуюсь скриптом. В TC 9,21a под Win7x64 при правильном указании путей и переменных всё прекрасно работает.
Что такое " должны разрядности меняться", в данном контексте не вполне понял. Для перезапуска со сменой разрядности есть, например, отдельный способ, упомянутый в этой же теме (с. 5-7). Им и пользуюсь.

#110:  Author: Jenialij PostPosted: Mon Feb 25, 2019 16:58
    —
Здравствуйте, Flasher.
Решил воспользоваться Вашим скриптом для перезагрузки TC, но не могу разобраться с ошибкой: "Параметры не соответствуют описанию!" при его вызове.

Win 7 x64
TC 9.21 x32
Пути к History.ini и TCFS2.exe указал свои.
TCFS2Tools загружается через Autorun.
Настройки TCFS2.ini дефолтные. В Readme_TCFS2Tools сказано: "Для использования возможностей TCFS2Tools добавьте следующие команды в секцию [Items] файла конфигурации TCFS2:..."
Добавлял эти команды, но не помогло.
Прошу помощи.

#111:  Author: AvadaLocation: Россия, Саратов PostPosted: Mon Feb 25, 2019 18:16
    —
Jenialij
А с указанными в шапке скрипта параметрами для вызывающей скрипт кнопки или юзер-команды что? (Тем более, что в сообщении об ошибке — прямой намёк на это.) И в ридми TCFS2Tools.dll вы непонятно зачем полезли. Где-то в скрипте предлагалось менять его настройки по умолчанию?


Last edited by Avada on Mon Feb 25, 2019 19:25; edited 1 time in total

#112:  Author: Jenialij PostPosted: Mon Feb 25, 2019 18:46
    —
Avada
Параметры указал такие же, как в шапке скрипта: "%X%P%Z" "%T" ""%N"" ""%M"
А в TCFS2.ini полез уже после, ибо не работало (обратил внимание на слова: "с обновлениями TCFS2.ini")

#113:  Author: AvadaLocation: Россия, Саратов PostPosted: Mon Feb 25, 2019 19:33
    —
Jenialij
В приведённых параметрах последней кавычки нет. Может быть, конечно, это здесь неверно скопировано... И ещё раз: никакие INI-файлы не нужны ни до, ни после. (Не говоря про то, что в ридми ясно написано про имя конфига для TCFS2Tools.dll — это ни разу не TCFS2.ini, а повторение имени модуля.) Я не писал там ничего, и у меня скрипт прекрасно работает который год подряд. Конфигурация TC и Windows практически та же самая. Проверьте как следует кнопку.

#114:  Author: Jenialij PostPosted: Mon Feb 25, 2019 19:45
    —
Avada
Последнюю кавычку уже сюда, на форум, "недоскопировал", в самих параметрах она есть.
Про ini понял.
Пересмотрел уже wincmd.ini - все секции, касающиеся History "редиректятся" в History.ini.
Загадка, но ведь ошибка именно в параметрах, как Вы верно отметили.

#115:  Author: AvadaLocation: Россия, Саратов PostPosted: Tue Feb 26, 2019 08:26
    —
Jenialij
Предъявите код кнопки (копировать в её контекстном меню, вставить текстом в сообщение). У меня есть сомнения, туда ли вы вообще записали параметры.

#116:  Author: Jenialij PostPosted: Tue Feb 26, 2019 11:48
    —
Avada
Команда:
[em_RestartTC]
cmd=%commander_path%\Scripts\TC\RestartTC.vbs
param="%X%P%Z" "%T" ""%N"" ""%M""
Menu=Перезапуск TC
***
Провел такой эксперимент - взял "чистый" TC 9.21 x32 (стандартно установил).
Внесенные изменения:
1) редирект секций [left], [right], [RightHistory], [LeftHistory] в History.ini;
2) установка Autorun.wdx с подключением в автозагрузку в цветовой схеме + автозагрузка TCFS2Tools.dll.
3) создание на панели TC кнопки:
cmd=%commander_path%\Scripts\TC\RestartTC.vbs
param="%X%P%Z" "%T" ""%N"" ""%M""

Скрипт заработал.
Значит, где-то в настройках "моего" TC ошибка. Но где?
Потом подумал: но в "своём" TC для запуска скрипта я использую команду em_, а в "чистом" TC - кнопку с указанием пути к скрипту с параметрами.
Казалось бы, какая разница? Но...
Создал в "чистом TC" файл WCMD_RUS.ini с единственной командой и прописал ее в кнопке.
Скрипт перестал работать, ошибка - "Параметры не соответствуют описанию!"

Повторил это всё многократно на "чистом" и "своём" TC.
Результат:
1) скрипт не работает через команду em_ (ни через кнопку, ни через меню WCMD_RUS.MNU )
2) скрипт работает только через кнопку с прописанным путём к скрипту с параметрами.

#117:  Author: AvadaLocation: Россия, Саратов PostPosted: Tue Feb 26, 2019 13:41
    —
Jenialij
Ошибка не в настройках, а в неполном понимании того, что куда нужно и можно записывать. Ключевой момент — имя INI-файла с em-командами. Для начала прочитайте хотя бы здесь, чем отличаются по области применения usercmd.ini и WCMD_RUS.ini и впредь последний файл (или подобные ему) как полный аналог usercmd.ini нигде и никогда не используйте. А если он для чего-то всё же нужен, помните о связанных с ним ограничениях. В "чистом" TC с английским языком, равно как и в русcком TC, использующем меню с именем, отличным от WCMD_RUS.MNU (например, расширенное), ВСЕ записи из этого INI-файла попросту игнорируются, программа его не видит, результат вами выше описан. Кроме того, если юзер-команда с одинаковым именем записана и в usercmd.ini, и в WCMD_RUS.ini, она берётся только из основного файла, даже если настройки внутри команды разные.
У меня сделана (разумеется, в usercmd.ini, предназначенном для любого языка и любого меню) юзер-команда со всеми параметрами, в кнопке указано её имя, всё прекрасно работает. К скрипту как таковому, насколько понимаю, всё это отношения не имеет никакого. Может быть, там и ещё что-то, но для начала с этим разберитесь.

#118:  Author: Jenialij PostPosted: Wed Feb 27, 2019 10:40
    —
Avada
Спасибо, что уделили время, и за напутствие по "ini" тоже.
Учту.
Но дело в том, что команда em_, перенесенная в usercmd.ini, у меня все равно не работает.
Повторения имени команды тоже нет. В "чистом" TC файл WCMD_RUS.ini удалил, а в usercmd.ini всего одна запись. В обеих TC одинаковая ошибка.
Где-то у меня что-то не так. Пользуюсь многими скриптами и всё нормально, а тут какая-то незадача.
Пока повесил скрипт на кнопку, не используя команду em_. Скрипт со своей задачей отлично справляется, да и ощутимо быстрее аналогов перезапускает TC.
Еще раз спасибо.

#119:  Author: AvadaLocation: Россия, Саратов PostPosted: Wed Feb 27, 2019 12:51
    —
Jenialij
У меня очень похожая на вашу конфигурация, вплоть до редиректа части секций (ну, пути несколько другие), и всё прекрасно работает.
Что в данном случае теперь означает "всё равно не работает"? Как вы её пытаетесь заставить работать?
Оставим на минуту в покое кнопку (равно как и меню). Попытайтесь попросту запустить из командной строки TC вашу команду em_RestartTC. Результат? И простенький вопрос: у вас другие пользовательские команды (любые) работают?
Между прочим, вы привели выше не код кнопки, а, насколько понимаю, две выдернутых из BAR-файла строки. Не надо так делать, весь код дайте (выше сказано — как, да и на форуме сто раз пояснялось): все восемь строк, включая пустые.

P.S. Одну разницу я всё-таки обнаружил: в одном из вариантов команды параметры записаны с дополнительными кавычками в начале и в конце:
param=""%X%P%Z" "%T" ""%N"" ""%M"""
Попробуйте это, хотя у меня всё работает с обычным набором кавычек (и даже после %M с одной вместо двух). В этом синтаксисе (сколько там где нужно кавычек), похоже, и причина (хотя пока непонятная).

#120:  Author: Jenialij PostPosted: Wed Feb 27, 2019 15:02
    —
Avada
Запуск команды em_RestartTC из командной строки TC также завершилось сообщением об ошибке.

А вот добавление еще одних кавычек проблему решило. Т.е. так:
param=""%X%P%Z" "%T" ""%N"" ""%M"""
Теперь все нормально.
Благодарю.

#121:  Author: sergiokapone PostPosted: Fri Mar 01, 2019 02:45
    —
Соорудил скрипт, который перезапускает TC с другой разрядностью
Code:

:: Перезапуск TC в другой разрядности
:: x32<=>x64

@echo off

SETLOCAL ENABLEDELAYEDEXPANSION
set x64=Totalcmd64.EXE

FOR /F %%i IN ('TASKLIST /NH /FI "IMAGENAME eq totalcmd*"') DO (
    FOR /F "tokens=2 delims==" %%j IN ('wmic process where "name='%%i'" get ExecutablePath /FORMAT:LIST') DO (
    set line=%%j
    taskkill /im %%i >NUL
    IF %%i==!x64! (start !line:64=!) ELSE (start !line:~0,-5!64!line:~-5!)
    )
)

exit


Если соорудить из этого скрипта exe-шник то при перезапуске теряется фокус на приложении, не критично, но не совершенно. Можно такое исправить? Сам bat-ник, кстати, не фокус не теряет.

#122:  Author: AvadaLocation: Россия, Саратов PostPosted: Mon Mar 04, 2019 21:26
    —
sergiokapone
Плохо всё это работает. Из 32-битного TC в 64-битный худо-бедно переключает: экзешник — с потерей текущего каталога (открывается тот, который был при последнем выходе из TC), батник без этого, но, естественно, с консольным окошком. А обратного переключения на 32-битный TC из 64-битного у меня вообще нет: появляется сообщение об ошибке, что не найден файл ТOTALCMD6464.EXE (именно так!), в случае с батником — в паре с незакрытым консольным окном.

#123:  Author: sergiokapone PostPosted: Mon Mar 04, 2019 21:58
    —
Avada wrote:
sergiokapone
Плохо всё это работает. Из 32-битного TC в 64-битный худо-бедно переключает: экзешник — с потерей текущего каталога (открывается тот, который был при последнем выходе из TC), батник без этого, но, естественно, с консольным окошком. А обратного переключения на 32-битный TC из 64-битного у меня вообще нет: появляется сообщение об ошибке, что не найден файл ТOTALCMD6464.EXE (именно так!), в случае с батником — в паре с незакрытым консольным окном.


Я тестил на Win10 на двух компах, скорее всего у Вас другая винда. А что выдает команда
Code:
wmic process where "name='totalcmd.exe'" get ExecutablePath /FORMAT:LIST


Code:
wmic process where "name='totalcmd64.exe'" get ExecutablePath /FORMAT:LIST



если просто набрать в консоли из x32 и x64, соответственно?

Или, может еще вариант, у Вас путь к totalcmd.exe содержит пробелы.

Добавлено спустя 37 минут:

Как вариант, попробуйте это скрипт
Code:

::wincmd.ini
::[Shortcuts]
::C+R=em_Restart_x32_x64_TC
::
::usercmd.ini
::[em_Restart_x32_x64_TC]
::cmd=%commander_path%\Scripts\Restart_x86-x64.cmd
::menu=Перезапуск TC в другой разрядности

@echo off

SETLOCAL ENABLEDELAYEDEXPANSION
set x64=Totalcmd64.EXE
set x32=totalcmd.EXE

FOR /F %%i IN ('TASKLIST /NH /FI "IMAGENAME eq totalcmd*"') DO (
    taskkill /im %%i >NUL
    IF %%i==!x64! ( 
        start !commander_path!\!x32! /F
        echo ============
        echo Запуск  x32
        echo ============
        timeout 1 >nul
    ) ELSE (
            start !commander_path!\!x64! /F
            echo ============
            echo Запуск  x64
            echo ============
            timeout 1 >nul
      )
)

exit

#124:  Author: AvadaLocation: Россия, Саратов PostPosted: Mon Mar 04, 2019 23:05
    —
sergiokapone
У меня Windows 7 x64, путь к TC пробелов не содержит.
Выполнение в консоли даёт ExecutablePath=C:\Totalcmd\TOTALCMD.EXE и соответствующий аналоги для 64-битного TC.
Скрипт в каком формате?
И цитировать меня полностью не надо. И так понятно, кто, с кем и о чём общается.

#125:  Author: sergiokapone PostPosted: Mon Mar 04, 2019 23:11
    —
.cmd или .bat, одинаково.

#126:  Author: AvadaLocation: Россия, Саратов PostPosted: Tue Mar 05, 2019 06:52
    —
sergiokapone
Да, сейчас батник вроде бы работает прилично (тщательно не проверял).

#127:  Author: sergiokapone PostPosted: Tue Mar 05, 2019 10:49
    —
exe-шник на основе батника

#128:  Author: AvadaLocation: Россия, Саратов PostPosted: Tue Mar 05, 2019 11:06
    —
sergiokapone
Нет, этот экзешник меня совершенно не устраивает. Во-первых теряются текущие пути. Во-вторых, обратное переключение из x64 не работает. При ближайшем рассмотрении последняя проблема есть и в батнике (утром дома вроде бы это работало, сейчас на другой машине с теми же системой и TC — нет). В-третьих, идёт наращивание номеров копий окна TC.
Я использую экзешник на основе этого скрипта из текущей темы с последующими модификациями (раз, два).

#129:  Author: sergiokapone PostPosted: Tue Mar 05, 2019 11:43
    —
Avada,
я, кажись, понимаю в чем проблема,
если Вам не трудно, можете проверить этот батник с сообщениями для debug'инга?
Code:

@echo off

SETLOCAL ENABLEDELAYEDEXPANSION
set "x64=Totalcmd64.EXE"
set "x32=totalcmd.EXE"

FOR /F %%i IN ('TASKLIST /NH /FI "IMAGENAME eq totalcmd*"') DO (
    echo Closing %%i
    timeout 2 >nul
    taskkill /im %%i >NUL
    IF "%%i" EQU "!x64!" (
        echo  "%%i" , "!x64!"
        echo Starting   !commander_path!\!x32!
        timeout 2 >nul
        start !commander_path!\!x32! /F
    ) ELSE (   
            echo  "%%i" , "!x64!"
            echo Starting !commander_path!\!x64!
            timeout 2 >nul
            start !commander_path!\!x64! /F 
      )
)

#130:  Author: AvadaLocation: Россия, Саратов PostPosted: Tue Mar 05, 2019 11:56
    —
sergiokapone
Батник работает приемлемо по всем указанным выше пунктам.

#131:  Author: sergiokapone PostPosted: Tue Mar 05, 2019 12:00
    —
Avada,
спасибо, проблема, думаю, была в лишних пробелах в переменных x64 и x32.

#132:  Author: AvadaLocation: Россия, Саратов PostPosted: Tue Mar 05, 2019 12:02
    —
sergiokapone
Понятно. Будет новый экзешник — гляну. Но заглавные буквы и точки забывать в сообщениях не надо.

#133:  Author: sergiokapone PostPosted: Tue Mar 05, 2019 12:12
    —
exe-шник (скачивание сразу, при нажатии).

#134:  Author: AvadaLocation: Россия, Саратов PostPosted: Tue Mar 05, 2019 12:22
    —
sergiokapone
Ровно тот же набор проблем, что и раньше. Число окон TC то увеличивается, то уменьшается с наращиванием при этом цифр для номеров копий, текущие каталоги не сохраняются, обратного переключения с x64 нет.

#135:  Author: sergiokapone PostPosted: Tue Mar 05, 2019 12:27
    —
Avada,
наверное exe-шником пользоваться не целесообразно. Я компилировал в
Quick Batch File Compiler. Может попробую, как-нибудь, другой компилятор.

#136:  Author: FlasherLocation: Москва PostPosted: Tue Mar 05, 2019 15:09
    —
Avada wrote:
У меня этот способ сохраняется как резервный, постоянно я давно уже пользуюсь скриптом.
Avada wrote:
Я использую экзешник на основе этого скрипта из текущей темы с последующими модификациями (раз, два).
Ты двумя скриптами пользуешься что-ли? В части последнего, по-моему, всё проще:
Code:
; Параметр в поле Команда: "%COMMANDER_EXE%"
$hWnd = WinActive("[CLASS:TTOTAL_CMD]")
If $hWnd Then
  WinClose($hWnd)
  ProcessWaitClose(WinGetProcess($hWnd))
  If @OSArch = 'x86' Or (StringRight($CmdLine[1], 6) = '64.exe') Then
    Run($CmdLine[1])
  Else
    Run(StringLeft($CmdLine[1], StringLen($CmdLine[1])-4) & '64.exe')
  EndIf
EndIf

Первый, морально устарел, конечно. Давно его не юзаю. Пошёл в итоге по пути команд TCFS2.


Last edited by Flasher on Tue Mar 05, 2019 17:00; edited 3 times in total

#137:  Author: AvadaLocation: Россия, Саратов PostPosted: Tue Mar 05, 2019 16:13
    —
Flasher
Да, у меня два скрипта: твой для перезапуска и упомянутый выше для смены битности. Впрочем, по мере появления, как видишь, рассматриваю и другие варианты. А твой свежий вариант скрипта перезапускает TC, но битность не меняет.

#138:  Author: FlasherLocation: Москва PostPosted: Tue Mar 05, 2019 16:16
    —
Avada
Ну, да, не меняет. А профит в чём? Для тестов?

#139:  Author: AvadaLocation: Россия, Саратов PostPosted: Tue Mar 05, 2019 16:20
    —
Flasher
Не понял. Ты предлагаешь скрипт на замену последнему из двух, который для смены битности? Ну так мне нужно её менять. Без всяких тестов, для повседневной работы.

#140:  Author: FlasherLocation: Москва PostPosted: Tue Mar 05, 2019 16:46
    —
Avada
Ты вроде всюду пишешь, что используешь 32-битный Тотал на x64 системе. Ну, ОК, исправил.

#141:  Author: AvadaLocation: Россия, Саратов PostPosted: Tue Mar 05, 2019 18:01
    —
Flasher
Если быть совсем точным, я использую комбинированный TC на разных системах. В x64 — преимущественно 32-битный (пока).
Скрипт гляну попозже, сейчас занят другими делами.

Добавлено спустя 1 час 25 минут:

Посмотрел. Не происходит обратное переключение с x64 на x32.

#142:  Author: FlasherLocation: Москва PostPosted: Tue Mar 05, 2019 20:16
    —
Avada
А, тебе чистый реверс нужен. Думал, что всегда в 64. Тогда так:
Code:
;:::::::::::::::::::: AU3 ::::::::::::::::::::
; Перезапуск ТС со сменой архитектуры x32<>x64
; Параметр в поле Команда: "%COMMANDER_EXE%"
;:::::::::::::::::::::::::::::::::::::::::::::
#NoTrayIcon
Local $hWnd = WinActive("[CLASS:TTOTAL_CMD]")
If $hWnd Then
  Opt("WinWaitDelay", 40)
  Local $TC = $CmdLine[1], $PFix = '', $n = 4
  WinClose($hWnd)
  ProcessWaitClose(WinGetProcess($hWnd))
  If @OSArch <> 'x86' Then
    If StringRight($TC, 6) = '64.EXE' Then
      $n = 6
    Else
      $PFix = '64'
    EndIf
  EndIf
  $PID = Run(StringLeft($TC, StringLen($TC) - $n) & $PFix & '.EXE')
  WinWaitActive("[CLASS:TTOTAL_CMD]")
  $WSS = ObjCreate('WScript.Shell')
  $WSS.AppActivate($PID)
EndIf
На Win x32 будет стандартный перезапуск.

Last edited by Flasher on Thu Mar 07, 2019 21:04; edited 7 times in total

#143:  Author: AvadaLocation: Россия, Саратов PostPosted: Tue Mar 05, 2019 20:38
    —
Flasher
Чистый реверс, конечно. У меня обе битности могут быть рабочими. Сейчас идёт нормальная перезагрузка с x32 на x64, а если наоборот, x64 закрывается, а x32 не открывается. Проверь.

#144:  Author: FlasherLocation: Москва PostPosted: Tue Mar 05, 2019 20:46
    —
Avada
Не вижу причин для этого. У тебя в точности такой вариант, как сейчас?

#145:  Author: sergiokapone PostPosted: Tue Mar 05, 2019 21:09
    —
Нли компилировать батник с Quick batch compiler со скрытием консольного окна, то лезут непонятные косяки с перезапуском, если разрешить запуск консольного окна, то отрабатывает так же, как и батник. Может, конечно у кого-то есть годное решение, как можно скрывать консольное окно.

Last edited by sergiokapone on Wed Mar 06, 2019 12:32; edited 1 time in total

#146:  Author: AvadaLocation: Россия, Саратов PostPosted: Wed Mar 06, 2019 06:50
    —
Flasher
В точности такой же. И с правильным параметром в правильном поле кнопки. Перепроверял только что.

#147:  Author: FlasherLocation: Москва PostPosted: Wed Mar 06, 2019 07:05
    —
Avada
При этом в папке ТС присутствуют TOTALCMD.exe и TOTALCMD64.exe?

#148:  Author: AvadaLocation: Россия, Саратов PostPosted: Wed Mar 06, 2019 07:25
    —
Flasher
Конечно, присутствуют.
Я попозже ещё место расположения скрипта попробую поменять.

#149:  Author: FlasherLocation: Москва PostPosted: Wed Mar 06, 2019 07:30
    —
Avada
Место расположения скрипта вообще никак не влияет.
Вставь последней строкой:
Code:
MsgBox(0, '', StringLeft($CmdLine[1], StringLen($CmdLine[1]) - 6) & $PFix & '.exe')
Что покажет?
4, 5, 9 строки можно временно закомментировать.
И в wincmd.ini у тебя Onlyonce=0 ?

#150:  Author: AvadaLocation: Россия, Саратов PostPosted: Wed Mar 06, 2019 10:21
    —
Flasher
Тестировать буду вечером дома: на работе с запуском этих скриптов в любой их модификации почему-то возникли проблемы, на уяснение и устранение которых пока нет времени. И, да, у меня Onlyonce=0.

Добавлено спустя 9 минут:

Удалось запустить тестовый вариант с дополнительной строкой.
При вызове x64 из x32 выводится окно с правильным путём:
Code:
-------------- ------------
0
---------------------------
C:\Totalcmd\TOTALCMD64.exe
---------------------------
ОК   
---------------------------

При обратном вызове имеем следующее:
Code:
---------------------------
0
---------------------------
C:\Totalcmd\TOTALCMDMD.exe
---------------------------
ОК   
---------------------------

Видно, что имя неправильное.
Надо продолжать с закомментированными строками?

#151:  Author: FlasherLocation: Москва PostPosted: Wed Mar 06, 2019 10:32
    —
Avada
Нужно было не продолжать, а начать с ними. Wink
В общем, всё ясно, сейчас исправлю.
Готово.

#152:  Author: AvadaLocation: Россия, Саратов PostPosted: Wed Mar 06, 2019 11:35
    —
Flasher
Вот теперь, похоже, всё в порядке. Спасибо, беру. Только я экзешник скомпилировал.

#153:  Author: FlasherLocation: Москва PostPosted: Wed Mar 06, 2019 11:40
    —
Avada
Ты последнюю редакцию взял? Я там дописку на всякий сделал.

#154:  Author: AvadaLocation: Россия, Саратов PostPosted: Wed Mar 06, 2019 11:41
    —
Да, взял последнюю редакцию, и дописку видел. А с экзешником начинается размножение окон, что не есть хорошо. А никак нельзя, чтобы перемененая указывалась в самом скрипте, а не в кнопке или юзер-команде?

#155:  Author: FlasherLocation: Москва PostPosted: Wed Mar 06, 2019 11:44
    —
А что толку от exe-шника?
Переменная нужна там для случая повышения прав.

#156:  Author: AvadaLocation: Россия, Саратов PostPosted: Wed Mar 06, 2019 11:54
    —
Flasher
А толку то, что при наличии экзешника не надо затеваться ассоциацией скриптовых файлов с AutoIt на произвольной машине. Кстати, сейчас у меня и экзешник правильно работает. Ничего не менял, между прочим...

#157:  Author: FlasherLocation: Москва PostPosted: Wed Mar 06, 2019 11:59
    —
Avada
Системная ассоциация тут к чему? При формировании кнопки/юзеркоманды ты пишешь путь к интерпретатору, скрипту и параметру. Как обычно. Ничего нового.

Насчёт "правильно работает" не понял. До этого размножал окна, а теперь что изменилось?

#158:  Author: AvadaLocation: Россия, Саратов PostPosted: Wed Mar 06, 2019 12:03
    —
Flasher
Теперь окна размножаться перестали. А системная (или внутренняя) ассоциация тут к тому, что без этого у меня скрипт не запускался. Ладно, это к делу не относится. Дома проверю последний вариант и, если всё нормально, перейду на него. Спасибо.


Last edited by Avada on Wed Mar 06, 2019 14:23; edited 1 time in total

#159:  Author: FlasherLocation: Москва PostPosted: Wed Mar 06, 2019 12:07
    —
Avada wrote:
А системная(или внутренняя) ассоциация тут к тому, что без этого у меня скрипт не запускался.
Внутренняя может помочь только при запуске из файловой панели. Явно не вариант для частого использования. А какие могут быть проблемы с указанной мной комбинацией, мне не ведомо. Не должно их быть при правильном формировании с учётом переменных среды, кавычек и пробелов.

Пож-та.

#160:  Author: AvadaLocation: Россия, Саратов PostPosted: Wed Mar 06, 2019 12:10
    —
Flasher wrote:
Внутренняя может помочь только при запуске из файловой панели. Явно не вариант для частого использования.

Да, верно, я на эти грабли уже наступал. (Кстати, это ограничение надо бы нормально документировать.) А скрипты некоторых типов я предпочитаю использовать скомпилированными в EXE. Можешь считать это моей личной прихотью, но мне так удобнее.

#161:  Author: FlasherLocation: Москва PostPosted: Wed Mar 06, 2019 12:38
    —
Avada
Ну, это такое... Даже не знаю как комментировать. Для меня смысл не пользоваться обёртками из интерпретатора и скрипта всегда актуален по нескольким причинам:
1. По сути создание exe-шников на базе интерпретатора - это плодение его сущностей. Не комильфо, если ты не создаёшь комбаин (названия некоторых мы знаем) или какое-то серьёзное многофунциональное оконное приложение.
2. Превосходящие в 900+ раз объёмы. Т.е. на 100 кодов, допустим, 90 Мб exe-шников вместо 50-100 Кб скриптов.
3. Зависимость от битности системы при компиляции в x64.
4. Создать заменяющую путь переменную %Autoit% в autorun.cfg c учётом битности не является проблемой.

#162:  Author: AvadaLocation: Россия, Саратов PostPosted: Wed Mar 06, 2019 13:34
    —
Flasher
1. Некоторые названия я действительно знаю и ничего очень уж плохого в этих решениях не вижу.
2. У меня таких файлов в TC используется мало, поэтому на приращение размера смело могу наплевать.
3. Так не компилирую, поэтому не зависит.
4. Является это проблемой или нет, смогу оценить при наличии времени на эксперименты. Пока что его нет.
Взгляды свои на это дело, разумеется, никому не навязываю. Мне просто так на данный момент удобнее.

#163:  Author: FlasherLocation: Москва PostPosted: Wed Mar 06, 2019 13:43
    —
Avada
1. Так я пишу про простые примеры: "... если ты не создаёшь ...".
2. Понятно. Но всё же.
3. Дело добровольное, но совместимость битностей родительского и дочернего процессов — вещь для запуска полезная.

В скрипт добавил активацию ТС, а то с этим проблемка имеется (у меня по крайней мере).

#164:  Author: AvadaLocation: Россия, Саратов PostPosted: Wed Mar 06, 2019 14:21
    —
Flasher
А что за проблемка? Может, и мне полезно это знать подробнее?

#165:  Author: FlasherLocation: Москва PostPosted: Wed Mar 06, 2019 15:00
    —
Avada
Проблема в её (активации) отсутствии после запуска Тотала. Раньше как-то ковырял, но сейчас уже не помню с чем связано (TwinKey, Listary, Everything, TCFS2 c режимом восстановления окна и т. д.).

#166:  Author: AvadaLocation: Россия, Саратов PostPosted: Wed Mar 06, 2019 18:25
    —
Flasher
Попробовал последний вариант. Кнопка (скрипт с параметром) работает нормально. Но точно такая же юзер-команда вызывает размножение окон TC. В чём может быть дело? Пока использую предыдущую версию, там у меня вроде как всё OK.

#167:  Author: FlasherLocation: Москва PostPosted: Wed Mar 06, 2019 19:26
    —
Avada
Так происходит при вызове с хоткея (Какого?) или и с кнопки с юзеркомандой тоже?
Под размножением окон ты подразумеваешь зацикливание создания экземпляров?
На чистом ТС без плагинов подобное наблюдается?

#168:  Author: AvadaLocation: Россия, Саратов PostPosted: Wed Mar 06, 2019 21:10
    —
Flasher
И с кнопки с юзер-командой, и при её запуске из командной строки TC, и хотееем для неё, без разницы. А с экземплярами там не зацикливание, а именно приращение. Допустим, у меня единственный 32-битный экземпляр без номера в заголовке. Выполняется команда. Открывается второе окно для 64-битного TC с (2) в заголовке. Выполняем в нём команду. 32-битная версия теперь открывается в третьем окне при сохранении прежних окон... и так далее. На чистом TC (только с юзер-командами) — та же история.

#169:  Author: FlasherLocation: Москва PostPosted: Thu Mar 07, 2019 02:05
    —
Avada
Т.е. ты просто хочешь сказать, что исходный экземпляр не закрывается? С учётом ProcessWaitClose(WinGetProcess($hWnd)) это довольно странная история, т.к. до открытия нового скрипт должен ждать бесконечно долго, пока не завершится процесс ТС. И только лишь с добавкой двух завершающих в условии элементов активации окна в этой части измениться ничего точно не могло. Либо ты слукавил насчёт последней редакции (дописка была и в предыдущем варианте без шапки).
И речь сейчас идёт только про скомпилированный случай? Или с актуальным AutoIt3.exe та же история? Компилятор Aut2exe.exe тоже актуальный?

#170:  Author: AvadaLocation: Россия, Саратов PostPosted: Thu Mar 07, 2019 08:31
    —
Flasher
Да, исходный экземпляр не закрывался. Но там, как выяснилось, результаты менялись несколько раз по непонятным причинам. Поэтому сегодня всё протестировал заново на той машине, где AutoIt3.exe и Aut2exe.exe использованы заведомо актуальные. Всё работает отовсюду, в том числе и в варианте c EXE. Видимо, на этом проблему можно считать закрытой.

#171:  Author: FlasherLocation: Москва PostPosted: Thu Mar 07, 2019 12:55
    —
Avada
Ну, и отлично. Так и думал, что дело в версии.

Сделал активацию ещё более стабильной.

#172:  Author: Skif_off PostPosted: Thu Mar 07, 2019 18:46
    —
http://forum.wincmd.ru/viewpost.php?p=129148
Code:
Opt("WinWaitDelay", 0)

Бессмысленное число, только процессор тр... теребить, 100 с головой хватит.
Code:
  WinWaitActive("[CLASS:TTOTAL_CMD]")
  $WSS = ObjCreate('WScript.Shell')
  $WSS.AppActivate($PID)

???
И проще $PID проверить, прежде чем снова теребить, окно не появится быстрее, если искать его в несколько раз чаще.
WinWaitActive() чаще используют если что-то запустили и теперь ждут евонное окно.
Code:
#NoTrayIcon
Opt("WinWaitDelay", 100)
Local $hWnd = WinGetHandle("[CLASS:TTOTAL_CMD]")
If $hWnd Then
  Local $TC = $CmdLine[1], $PFix = '', $n = 4
  WinClose($hWnd)
  ProcessWaitClose(WinGetProcess($hWnd))
  If @OSArch <> 'x86' Then
    If StringRight($TC, 6) = '64.EXE' Then
      $n = 6
    Else
      $PFix = '64'
    EndIf
  EndIf
  Local $PID = Run(StringLeft($TC, StringLen($TC) - $n) & $PFix & '.EXE')
  If $PID <> 0 Then
    $hWnd = WinWait("[CLASS:TTOTAL_CMD]")
    WinActivate($hWnd)
  EndIf
EndIf

#173:  Author: FlasherLocation: Москва PostPosted: Thu Mar 07, 2019 19:12
    —
Skif_off wrote:
только процессор тр... теребить
От несколько миллисекунд ему хуже не станет. Это не проблема. Хотя всегда брал 40, пусть и тут будет.

Skif_off wrote:
И проще $PID проверить, прежде чем снова теребить
Что значит "снова"? Вопрос не в простоте, а в надёжности. В случае возврата 0-ля активации не будет. Логика.
WinActivate(WinWait("[CLASS:TTOTAL_CMD]")) при нескольких экземплярах не годится.
Что делает WinWaitActive я в курсе.

#174:  Author: Skif_off PostPosted: Thu Mar 07, 2019 22:41
    —
Flasher wrote:
От несколько миллисекунд ему хуже не станет. Это не проблема.

Если окно появляется через 200 мс после запуска, то к чему, грубо говоря, две сотни раз его искать вместо 2-3х?
Flasher wrote:
Вопрос не в простоте, а в надёжности. В случае возврата 0-ля активации не будет. Логика.

В случае возврата 0-ля активация и не нужна: это значит, что функция Run() не сработала и не вернула PID процесса - активировать нечего.
Flasher wrote:
WinActivate(WinWait("[CLASS:TTOTAL_CMD]")) при нескольких экземплярах не годится.

WinWaitActive("[CLASS:TTOTAL_CMD]") при нескольких экземплярах тоже не годится, например, в другой копии любое окно с флагом MB_SYSTEMMODAL или с указанным родительским активирует её. Активность окна в любом случае не самый удачный признак нужного (в начале скрипта при получении дескриптора для WM_CLOSE тоже).

#175:  Author: FlasherLocation: Москва PostPosted: Thu Mar 07, 2019 23:09
    —
Skif_off wrote:
то к чему, грубо говоря, две сотни раз его искать вместо 2-3х?
2 сотни с потолка взято, я так понимаю?
Skif_off wrote:
это значит, что функция Run() не сработала
Ничего подобного. Это вполне может значить, что она не успела получить PID.
WinWaitActive годится, т.к. ждёт активации, а не уже активного окна. И модальность тут за уши притягивать смысла нет, т.к. закрывался активный экземпляр. Плюс мне было на чём проверять, это не чьи-то домыслы, а подтверждено на практике.

#176:  Author: Skif_off PostPosted: Fri Mar 08, 2019 10:57
    —
Flasher wrote:
2 сотни с потолка взято, я так понимаю?

Ты "грубо говоря" забыл зацепить.
Flasher wrote:
Ничего подобного. Это вполне может значить, что она не успела получить PID.

Т.е. процесс создан, во всю рисует окно, а у тебя PID всё ещё не получен? Загугли описание CreateProcess, оно везде одинаковое:
Quote:
Return Value

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. ...
Note that the function returns before the process has finished initialization.

Flasher wrote:
WinWaitActive годится, т.к. ждёт активации, а не уже активного окна. И модальность тут за уши притягивать смысла нет, т.к. закрывался активный экземпляр. Плюс мне было на чём проверять, это не чьи-то домыслы, а подтверждено на практике.

Годится, если активным не успело вылезти окно другой копии, модальность тут - пример причины, когда это происходит без участия и желания пользователя.
Ну а на моей практике с двумя и более копиями (не только тестов, но просто использования) неприлично часто бывало, что не то окно закрыто или не то активировано. Ты ведь не думаешь, что от нечего делать у себя получаю PID родительской копии TC вместо поиска активного окна?

P.S. К слову, с COM-объектами могут быть сюрпризы в WinPE.

#177:  Author: FlasherLocation: Москва PostPosted: Fri Mar 08, 2019 11:13
    —
Skif_off
У меня, честно говоря, нет желания тебе разжёвывать всё (невозврат PID, наличие окна другого экземпляра следом за текущим, COM на WinPE), что давно и перед обновлением пройдено мной на практике в разных ипостасях. Я этот скрипт не для себя писал. Мне это обсуждение в рамках темы малоинтересно.



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