1

Тема: VBS: никак не пойму конструкцию

Здравствуйте,

Нашел здесь интересный пример скрипта. Все работает, но я никак не могу вникнуть в логику...
Скажите, это:

Set test=GetObject("winmgmts:\\.\root\CIMV2:win32_process.Handle='" & _
    CreateObject("WScript.Shell").Exec("rundll32 kernel32,Sleep").ProcessId & "'")

тоже самое что и это:

Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set WshShell = CreateObject("WScript.Shell")
procID = WshShell.Exec("rundll32 kernel32,Sleep").ProcessId
Set test = objWMIService.ExecQuery("Select * from Win32_Process where Handle = '" & procID & "'")

?
Только, как в первом случае получается конкретный объект, когда как во втором набор (ну из одного объекта, только к нему все равно приходиться по ItemIndex(0) обращаться)...

З.Ы. Если несу какую ересь, просьба сильно не бить, 'скриптер' я начинающий.

2

Re: VBS: никак не пойму конструкцию

А это особенность ExecQuery. Мне про неё совсем недавно  там объясняли

3

Re: VBS: никак не пойму конструкцию

Engraf, в первом случае — это экземпляр объекта, во втором случае — коллекция объектов.

Во втором случае можно и так:

Set test = objWMIService.Get("Win32_Process.Handle='" & CStr(procID) & "'")

Насчёт же:

по ItemIndex(0)

я что-то сомневаюсь.

4

Re: VBS: никак не пойму конструкцию

alexii пишет:

в первом случае — это экземпляр объекта, во втором случае — коллекция объектов.

Это я вроде понял.
Получается типа-Sql запрос возвращает, так сказать wmi-путь, который в первом примере используется напрямую, без запроса?

alexii пишет:

Насчёт же:
по ItemIndex(0)
я что-то сомневаюсь.

Я, пока не увидел вышеуказанный пример, только через ItemIndex(0) обращался к полученным через запрос объектам. Ес-сно подразумевается, что такой объект 1 в коллекции (не может же быть 2 процесса с одним PID'ом).

Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set WshShell = CreateObject("WScript.Shell")
procID = WshShell.Exec("rundll32 kernel32,Sleep").ProcessId
Set test = objWMIService.ExecQuery("Select * from Win32_Process where Handle = '" & procID & "'")
WScript.Echo test.ItemIndex(0).ParentProcessId
test.Terminate

5

Re: VBS: никак не пойму конструкцию

Получается типа-Sql запрос возвращает, так сказать wmi-путь, который в первом примере используется напрямую, без запроса?

В первом случае — вообще не WQL-запрос, а путь, указывающий на конкретный экземпляр класса «Win32_Process». Во втором случае — WQL-запрос возвращает коллекцию экземпляров объектов (даже если она будет содержать единственный экземпляр).

Я, пока не увидел вышеуказанный пример, только через ItemIndex(0) обращался к полученным через запрос объектам.

У меня Ваш код не работает:

Column:    1
Error:    Объект не поддерживает это свойство или метод: 'test.ItemIndex'
Code:    800A01B6
Source:    Ошибка выполнения Microsoft VBScript

6 (изменено: Engraf, 2014-07-16 12:07:10)

Re: VBS: никак не пойму конструкцию

Только что проверил на winXP - действительно не работает. На win7 (x64) работает без ошибок...

7

Re: VBS: никак не пойму конструкцию

Engraf, угу, всё верно. Это SWbemObjectSet::ItemIndex method (Windows) новый метод, появился только в NT 6.x:

Minimum supported client Windows Vista
Minimum supported server Windows Server 2008

Это хорошо, потому как меня буквально бесила необходимость обязательного перечисления коллекции только для того, чтобы получить её единственный экземпляр. Спасибо, будем знать на будущее.

8 (изменено: Engraf, 2014-07-16 12:30:39)

Re: VBS: никак не пойму конструкцию

Почему так получается:

alexii пишет:

Во втором случае можно и так: Set test = objWMIService.Get("Win32_Process.Handle='" & CStr(procID) & "'")

А вот так ругается на неправильный путь:

Set test = objWMIService.Get("Win32_NetworkAdapter.AdapterType='Ethernet 802.3'")

?

9

Re: VBS: никак не пойму конструкцию

Почему так получается:

Потому что ключом для класса «Win32_Process» является свойство «Handle».

А вот так ругается на неправильный путь:

Потому что ключом для класса «Win32_NetworkAdapter» является свойство «DeviceID», а не «AdapterType»:

+ открыть спойлер

http://i.imgur.com/XOXPYGn.png

В этом случае придётся использовать запрос «.ExecQuery("SELECT * FROM Win32_NetworkAdapter WHERE AdapterType = 'Ethernet 802.3'")» и работать затем с полученной коллекцией.

10

Re: VBS: никак не пойму конструкцию

Ясно, спасибо.

Пошел копать доки про ключи...

11

Re: VBS: никак не пойму конструкцию

С классикой:

Вы всё ещё не используете WMI? Часть I::Журнал СА 1.2006
Вы всё ещё не используете WMI? Часть II: пишем сценарии::Журнал СА 2.2006
Узнай секреты WMI: события и провайдеры. Часть I: дополнительные возможности::Журнал СА 3.2006
Узнай секреты WMI: события и провайдеры. Часть II: ключ к управлению системой и приложениями::Журнал СА 5.2006

знакомы?

12

Re: VBS: никак не пойму конструкцию

Спасибо за направление.

Я в основном на msdn/technet смотрел.

13

Re: VBS: никак не пойму конструкцию

Я в основном на msdn/technet смотрел.

Это правильный подход, коллега.

14

Re: VBS: никак не пойму конструкцию

Спасибо вам за ссылки! Вторую и последующие части публикаций, ни где не мог найти.
http://www.script-coding.com/WMI.html тоже хорошо описано с примерами!