Тема: WSH: как из скрипта определить его идентификатор процесса (PID)
Из скрипта, посредством объекта WshScriptExec, запускается дочерний процесс «mshta.exe». Затем, посредством WMI, извлекается экземпляр Win32_Process объекта SWbemObjectEx запущенного дочернего процесса «mshta.exe», основываясь на полученном из объекта WshScriptExec PID этого дочернего процесса. После чего, из полученного экземпляра Win32_Process берётся родительский PID (.ParentProcessID), который и будет являться идентификатором процесса скрипта. Последним действием будет закрытие запущенного дочернего процесса через объект WshScriptExec.
Замечание: приложение «mshta.exe» и его специальным образом подобранная командная строка позволяют создать скрытое окно, чтобы GUI окно (или окно консоли) дочернего процесса не отображалось на экране и не мешало работе.
Option Explicit
WScript.Echo GetScriptProcessID()
WScript.Quit 0
'=============================================================================
'=============================================================================
Function GetScriptProcessID()
Dim objWshShell
Dim objWshScriptExec
Dim objSWbemObjectEx_ChildProcess
Dim strPath
strPath = """mshta.exe"" " & _
"""<HTML><HEAD><HTA:APPLICATION APPLICATIONNAME='GetParentPID' " & _
"WINDOWSTATE='minimize' SHOWINTASKBAR='no'</HEAD></HTML>"""
Set objWshShell = WScript.CreateObject("WScript.Shell")
Set objWshScriptExec = objWshShell.Exec(strPath)
Set objSWbemObjectEx_ChildProcess = GetObject( _
"winmgmts:\\.\root\CIMV2:Win32_Process.Handle='" & CStr(objWshScriptExec.ProcessID) &"'")
GetScriptProcessID = objSWbemObjectEx_ChildProcess.ParentProcessID
objWshScriptExec.Terminate
Set objSWbemObjectEx_ChildProcess = Nothing
Set objWshScriptExec = Nothing
Set objWshShell = Nothing
End Function
'=============================================================================
Отдельное спасибо коллеге Slav за ценное замечание.