Определить разрядность запущенного TC

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

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

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

Сообщение Flasher »

gora
Так нужен или нет? Если да, то прошу ещё раз ответить на вопрос о месте скрипта в цепочке. И что лучше, писать значение в какой-то временный файл, чтобы батник читал оттуда или через WScript.StdOut?

Если так уж хочется cmd, то можно команду wmic поковырять, чтобы получить родителя установщика. Получаем родителя - получаем имя. Я правда не по имени определяю, а по более надёжному методу.
Кстати, Exe-шник ТСx64 можно переименовывать?
Аватара пользователя
gora
Сообщения: 442
Зарегистрирован: Чт дек 30, 2004 13:09
Откуда: Иваново

Сообщение gora »

Flasher
Нужен.
Запускаться будет из батника.
Значение писать в файл (рядом со скриптом), т.к., значение я буду считывать тем же батником.
Win7 SP1 Ultimate x64, TC8.52a x64
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

gora
А как же скрипт будет писать в файл, расположенный внутри установщика? Или скрипт тоже будет из временной папки вызываться?
Последний раз редактировалось Flasher Пт янв 20, 2012 21:14, всего редактировалось 1 раз.
Аватара пользователя
gora
Сообщения: 442
Зарегистрирован: Чт дек 30, 2004 13:09
Откуда: Иваново

Сообщение gora »

Flasher
Все происходит во временной папке.
Win7 SP1 Ultimate x64, TC8.52a x64
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Ок, понял.

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

If CreateObject("WScript.Shell").Environment("Process")("COMMANDER_PATH") = "" Then WScript.Quit
Set WMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set FSO = CreateObject("Scripting.FileSystemObject")
' Узнаём PID родителя скрипта:
For Each P in WMI.ExecQuery("SELECT ParentProcessId FROM Win32_Process WHERE ExecutablePath Like '" &_
Replace(WScript.FullName,"\","\\") & "'")
  Parent = P.ParentProcessId
Next
' Узнаём путь к TC:
Do Until StrComp(Left(Name, 8), "totalcmd", 1) = 0 And StrComp(FSO.GetExtensionName(Name), "exe", 1) = 0
  For Each P in WMI.ExecQuery("SELECT Caption, ExecutablePath, ParentProcessId FROM Win32_Process WHERE ProcessId Like " & Parent)
    Name   = P.Caption
    TC     = P.ExecutablePath
    Parent = P.ParentProcessId
  Next
Loop

' Создаём рядом со скриптом файл и пишем в него битность:
If FSO.GetFile(TC).Size < 7000000 Then Arch = "x32" Else Arch = "x64"
FSO.OpenTextFile(FSO.GetParentFolderName(WScript.ScriptFullName) & "\Arch.txt", 2, True).WriteLine Arch
Set WMI = Nothing : Set FSO = Nothing : WScript.Quit
Я мог и через выходной поток, но раз нужно через текстовый файл, то...

Add: кое-что поправил.
Последний раз редактировалось Flasher Вт янв 24, 2012 16:19, всего редактировалось 5 раз.
Аватара пользователя
gora
Сообщения: 442
Зарегистрирован: Чт дек 30, 2004 13:09
Откуда: Иваново

Сообщение gora »

Flasher
Потестировал.
Во всех вариантах запуска на x64\x86 OS и x64\x86 TC в файле x64.
Win7 SP1 Ultimate x64, TC8.52a x64
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

gora
Как вызывается батник? Можно поставить отладочную строку MsgBox TC перед ' Создаём ...
Что покажет?
Аватара пользователя
gora
Сообщения: 442
Зарегистрирован: Чт дек 30, 2004 13:09
Откуда: Иваново

Сообщение gora »

Flasher
Разобрался на свежую голову. Скрипт работает! Спасибо.
Пришлось увеличить число уровней вложенности в скрипте на 2, т.к., я не учел запуск батника через CMD+рекурсивный запуск самого SFX.
Но что хотелось бы заметить. Скрипт определяет разрядность не процесса ТС, а разрядность родительского процесса при фиксированной "глубине вложенности". Это не позволит использовать его при произвольной вложенности процесса скрипта. Может быть доработать скрипт и анализировать хотя бы имя процесса по маске "Totalcmd*.exe", а число уровней вложенности сделать не фиксированным?
Win7 SP1 Ultimate x64, TC8.52a x64
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

gora писал(а):т.к., я не учел запуск батника через CMD+рекурсивный запуск самого SFX.
Как раз выше про cmd писал. А SFX, я так понимаю, идёт перед установщиком?
gora писал(а):Это не позволит использовать его при произвольной вложенности процесса скрипта.
Так цель была использовать в инсталляторе. Там же вложенность известна теперь заведомо.
gora писал(а):Может быть доработать скрипт и анализировать хотя бы имя процесса по маске "Totalcmd*.exe", а число уровней вложенности сделать не фиксированным?
Сделано.
Add: Заменил на полноценную маску.
Аватара пользователя
gora
Сообщения: 442
Зарегистрирован: Чт дек 30, 2004 13:09
Откуда: Иваново

Сообщение gora »

Flasher писал(а):Заменил на полноценную маску
Не работает должным образом.
При запуске TC -> скрипт, или TC -> батник -> скрипт, или Проводник -> батник -> скрипт всегда показывает разрядность своего непосредственного родителя. Т.е., цикл срабатывает только один раз.
Для проверки добавил в цикл

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

MsgBox Name & " - " & TC & " - " & Parent & " - " & LCase(Left(Name, 8)) & " - " & LCase(FSO.GetExtensionName(Name))
и окно появляется только один раз.
Неплохо бы добавить "защиту от дурака", т.е., от запуска скрипта вообще без ТС, что бы скрипт не повисал в бесконечном поиске ТС.
Win7 SP1 Ultimate x64, TC8.52a x64
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

gora, поправил.
Аватара пользователя
gora
Сообщения: 442
Зарегистрирован: Чт дек 30, 2004 13:09
Откуда: Иваново

Сообщение gora »

Flasher
Теперь работает. Спасибо!
"Защита от дурака" оказалась неэффективной. Запустил ТС, затем из Проводника запустил батник и скрипт зациклился.
Убрал проверку переменной COMMANDER_PATH, добавил счетчик в петлю и выхожу из скрипта при превышении счетчиком установленного числа (заведомо большего возможной глубины вложения запуска скрипта). Теперь "защита" работает как надо. :)
Win7 SP1 Ultimate x64, TC8.52a x64
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

gora писал(а):Запустил ТС, затем из Проводника запустил батник и скрипт зациклился.
Не подтверждаю. Вызываю explorer хоть из ТС, хоть по Win+E, оттуда скрипт, ничего не зацикливается. Там же из контекстрого меню на файле выбираю "Открыть в командной строке" - тишина.
А счётчик я сам сперва предложил, потом вспомнил про внутренние переменные среды.
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

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

Сообщение Flasher »

Это ответ на твой пост. Строки в Ini, касаемые About, действительно нет смысла расшифровывать, т.к. нужно было получать путь к TC, а не ini файлам, которые к топику отношения никакого не имеют. Вообще не понял смысл твоего предложения.
Ответить