Определить разрядность запущенного TC
Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер
gora
Так нужен или нет? Если да, то прошу ещё раз ответить на вопрос о месте скрипта в цепочке. И что лучше, писать значение в какой-то временный файл, чтобы батник читал оттуда или через WScript.StdOut?
Если так уж хочется cmd, то можно команду wmic поковырять, чтобы получить родителя установщика. Получаем родителя - получаем имя. Я правда не по имени определяю, а по более надёжному методу.
Кстати, Exe-шник ТСx64 можно переименовывать?
Так нужен или нет? Если да, то прошу ещё раз ответить на вопрос о месте скрипта в цепочке. И что лучше, писать значение в какой-то временный файл, чтобы батник читал оттуда или через WScript.StdOut?
Если так уж хочется cmd, то можно команду wmic поковырять, чтобы получить родителя установщика. Получаем родителя - получаем имя. Я правда не по имени определяю, а по более надёжному методу.
Кстати, Exe-шник ТСx64 можно переименовывать?
gora
А как же скрипт будет писать в файл, расположенный внутри установщика? Или скрипт тоже будет из временной папки вызываться?
А как же скрипт будет писать в файл, расположенный внутри установщика? Или скрипт тоже будет из временной папки вызываться?
Последний раз редактировалось Flasher Пт янв 20, 2012 21:14, всего редактировалось 1 раз.
Ок, понял.
Я мог и через выходной поток, но раз нужно через текстовый файл, то...
Add: кое-что поправил.
Код: Выделить всё
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.QuitAdd: кое-что поправил.
Последний раз редактировалось Flasher Вт янв 24, 2012 16:19, всего редактировалось 5 раз.
Flasher
Разобрался на свежую голову. Скрипт работает! Спасибо.
Пришлось увеличить число уровней вложенности в скрипте на 2, т.к., я не учел запуск батника через CMD+рекурсивный запуск самого SFX.
Но что хотелось бы заметить. Скрипт определяет разрядность не процесса ТС, а разрядность родительского процесса при фиксированной "глубине вложенности". Это не позволит использовать его при произвольной вложенности процесса скрипта. Может быть доработать скрипт и анализировать хотя бы имя процесса по маске "Totalcmd*.exe", а число уровней вложенности сделать не фиксированным?
Разобрался на свежую голову. Скрипт работает! Спасибо.
Пришлось увеличить число уровней вложенности в скрипте на 2, т.к., я не учел запуск батника через CMD+рекурсивный запуск самого SFX.
Но что хотелось бы заметить. Скрипт определяет разрядность не процесса ТС, а разрядность родительского процесса при фиксированной "глубине вложенности". Это не позволит использовать его при произвольной вложенности процесса скрипта. Может быть доработать скрипт и анализировать хотя бы имя процесса по маске "Totalcmd*.exe", а число уровней вложенности сделать не фиксированным?
Win7 SP1 Ultimate x64, TC8.52a x64
Как раз выше про cmd писал. А SFX, я так понимаю, идёт перед установщиком?gora писал(а):т.к., я не учел запуск батника через CMD+рекурсивный запуск самого SFX.
Так цель была использовать в инсталляторе. Там же вложенность известна теперь заведомо.gora писал(а):Это не позволит использовать его при произвольной вложенности процесса скрипта.
Сделано.gora писал(а):Может быть доработать скрипт и анализировать хотя бы имя процесса по маске "Totalcmd*.exe", а число уровней вложенности сделать не фиксированным?
Add: Заменил на полноценную маску.
Не работает должным образом.Flasher писал(а):Заменил на полноценную маску
При запуске TC -> скрипт, или TC -> батник -> скрипт, или Проводник -> батник -> скрипт всегда показывает разрядность своего непосредственного родителя. Т.е., цикл срабатывает только один раз.
Для проверки добавил в цикл
Код: Выделить всё
MsgBox Name & " - " & TC & " - " & Parent & " - " & LCase(Left(Name, 8)) & " - " & LCase(FSO.GetExtensionName(Name))Неплохо бы добавить "защиту от дурака", т.е., от запуска скрипта вообще без ТС, что бы скрипт не повисал в бесконечном поиске ТС.
Win7 SP1 Ultimate x64, TC8.52a x64
Flasher
Теперь работает. Спасибо!
"Защита от дурака" оказалась неэффективной. Запустил ТС, затем из Проводника запустил батник и скрипт зациклился.
Убрал проверку переменной COMMANDER_PATH, добавил счетчик в петлю и выхожу из скрипта при превышении счетчиком установленного числа (заведомо большего возможной глубины вложения запуска скрипта). Теперь "защита" работает как надо.
Теперь работает. Спасибо!
"Защита от дурака" оказалась неэффективной. Запустил ТС, затем из Проводника запустил батник и скрипт зациклился.
Убрал проверку переменной COMMANDER_PATH, добавил счетчик в петлю и выхожу из скрипта при превышении счетчиком установленного числа (заведомо большего возможной глубины вложения запуска скрипта). Теперь "защита" работает как надо.
Win7 SP1 Ultimate x64, TC8.52a x64
Не подтверждаю. Вызываю explorer хоть из ТС, хоть по Win+E, оттуда скрипт, ничего не зацикливается. Там же из контекстрого меню на файле выбираю "Открыть в командной строке" - тишина.gora писал(а):Запустил ТС, затем из Проводника запустил батник и скрипт зациклился.
А счётчик я сам сперва предложил, потом вспомнил про внутренние переменные среды.