Если вы никогда не слышали об ускорителях типов [wmi], [wmiclass] и [wmisearcher], знайте, что вы не одиноки. В электронной документации к Windows PowerShell эти ускорители не упоминаются. Если же вы возьмете на себя труд поискать на Web-сайте Microsoft, то найдете ссылки на них в колонках для составителей сценариев «Hey, Scripting Guy!» и в нескольких блогах, но не более того.

Итак, что же такое ускорители типов? Известно, что оболочка PowerShell базируется на платформе Windows.NET Framework, и именно по этой причине платформа .NET Framework необходима для установки PowerShell. Благодаря ускорителям типов становится проще обращаться к классам .NET в коде PowerShell. Так, использование ускорителей типов [wmi], [wmiclass] и [wmisearcher] упрощает обращение к нескольким классам в пространстве имен System.Management платформы .NET Framework, которая используется инструментарием управления Windows (WMI). Другие ускорители типов дают возможность обращаться к иным пространствам имен .NET и к их классам. Более подробная информация приведена во врезке «Другие типы ускорителей». Так вот, поскольку вы сможете без труда обращаться к классам .NET, у вас будет возможность сократить объем необходимого кода. Но что, пожалуй, еще важнее — вы сможете без труда обращаться к свойствам и методам классов .NET, при том что некоторые из них недоступны с использованием составной команды Get-WmiObject среды PowerShell.

Ускоритель типов [wmi]

Ускоритель типов [wmi] дает возможность без труда обращаться к классу ManagementObject, который представляет объект WMI. Вы указываете путь к конкретному объекту WMI, и ускоритель типов [wmi] возвращает этот объект. Данный ускоритель типов можно использовать вместо команды Get-WmiObject с параметром -filter. Допустим, вам нужно обратиться к объекту, представляющему планировщик заданий Task scheduler на вашем компьютере. С помощью команды Get-WmiObject можно выполнить инструкцию

Get-WmiObject -class Win32_Service -filter "name='Schedule'"

Если бы вы использовали ускоритель типов [wmi], команда выглядела бы так:

[wmi] 'Win32_Service.Name= "Schedule"'

На экране представлены результаты выполнения обеих инструкций.

Результаты выполнения инструкций

Как видите, используя любую из инструкций, вы получаете одни и те же данные, и при этом ускоритель типов [wmi] позволяет вводить меньше символов (хотя их и так будет немного, особенно если вы будете использовать псевдоним команды Get-WmiObject).

Если вам нужно будет быстро отыскать информацию, не отображаемую на применяемом по умолчанию дисплее, можно использовать такую, например, инструкцию:

([wmi] 'Win32_Service.Name= "Schedule"').description

Здесь надо сделать одно предостережение (увы, почти все хорошее доступно нам с определенными ограничениями). Для успешного применения ускорителя типов [wmi] нужно знать точный путь к объекту, который содержится в свойстве __PATH. Чтобы отыскать путь к объекту WMI в пространстве имен rootcimv2, можно оптимизировать и использовать следующий код:

$colItems = Get-WmiObject -class "" | sort "Name"  foreach ($objItem in $colItems) {Write- Host $objItem.Name, $objItem.__Path}

В этом фрагменте строку следует заменить именем класса, который содержит разыскиваемый объект WMI. В описание класса не следует включать угловые скобки.

Упомянутый код возвращает имя и путь ко всем объектам WMI в указанном классе, и, чтобы найти интересующий объект, вам останется только выполнить поиск по всем именам. Рядом с именем будет указан путь. Та часть пути, которую следует применять при использовании ускорителя типов [wmi], отображается после двоеточия.

Так, если необходимо найти путь к объекту WMI, представляющему службу Spooler в классе Win32_Service, выполните код

$colItems = Get-WmiObject -class "Win32_Service" | sort "Name" foreach ($objItem in $colItems) {Write- Host $objItem.Name, $objItem.__Path}

В выходных данных найдите запись

Spooler ootcimv2: Win32_Service.Name="Spooler"

где вместо символов указано имя вашего компьютера. В данном случае часть пути, которую следует указывать при использовании ускорителя типов [wmi], — это Win32_Service.Name= «Spooler».

Важно выполнять проверку возвращенного пути; дело в том, что это не всегда имя объекта, как, скажем, в приведенных примерах. Так, если вы решите, что путем к объекту WMI, представляющему процесс Internet Explorer (IE), является строка Win32_Process.Name= «iexplore.exe», и выполните инструкцию

[wmi] 'Win32_Process.Name= "iexplore.exe"'

то получите сообщение об ошибке. В путях к объектам WMI используются ключевые свойства объекта. Ключевым является свойство, уникально идентифицирующее тот или иной экземпляр. И, поскольку все службы должны иметь уникальные имена, свойство Name является ключевым свойством класса Win32_Service. Однако сказанное не относится к классу Win32_Process, так как вы, возможно, выполняете несколько экземпляров того или иного процесса. Если же вы выполните код для определения пути

$colItems = Get-WmiObject -class "Win32_Process" | sort "Name" foreach ($objItem in $colItems) {Write- Host $objItem.Name, $objItem.__Path}

то увидите, что ключевым свойством для класса Win32_Process является свойство Handle, совпадающее с идентификатором процесса. Идентификаторы процессов могут часто меняться, поэтому путь следует заново определять перед каждым обращением к объекту Win32_Process.

Определив значение свойства Handle интересующего вас процесса, вы можете считать данные об этом процессе с помощью инструкции

[wmi] 'Win32_Process.Handle=""'

где является искомым значением (не нужно включать в код угловые скобки). Идентификаторы процессов могут быть длиной от одного до четырех символов. Отметим, что можно еще более сократить число вводимых символов, если указывать только значение ключевого свойства. Так, код

[wmi] ‘Win32_Process=""’

возвратит те же результаты, что и предыдущая инструкция. Если вы решите прекратить процесс, можете выполнить такой код:

([wmi] 'Win32_Process=""'). Terminate ()

Ускоритель типов [wmiclass]

Ускоритель типов [wmiclass] обеспечивает возможность без проблем обращаться к классу ManagementClass, который представляет классы WMI для управления операционными системами на базе Windows (такими, как Win32_Process, Win32_Service, Win32_LogicalDisk). Так же, как и команда Get-WmiObject, ускоритель типов [wmiclass] позволяет работать с существующими классами WMI. Но, в отличие от команды Get-WmiObject, ускоритель типов [wmiclass] дает возможность создавать новый экземпляр класса WMI, поскольку вы обращаетесь к статическим методам класса (т. е. к методам, не привязанным к тому или иному объекту, а предоставляемым самим этим классом).

Так, в следующем фрагменте кода

([wmiclass]'Win32_Process'). create ("cmd.exe")

ускоритель типов [wmiclass] используется для обращения к классу Win32_Process, после чего метод данного класса Create применяется для формирования нового процесса cmd.exe. Здесь используется ускоритель типов [wmiclass] для обращения к классу Win32_Process, а затем применяется метод этого класса Create для создания нового процесса cmd.exe, который будет выполнять команду ipconfig.

Ускоритель типов [wmisearcher]

Ускоритель типов [wmisearcher] дает возможность без труда обращаться к классу ManagementObjectSearcher, который представляет коллекцию объектов WMI, считанных из запроса. При использовании этого ускорителя типов запрос, который будет выполняться, необходимо сформулировать на языке WQL (WMI Query Language), а чтобы обратиться к коллекции, возвращенной этим запросом, использовать метод Get () класса ManagementObjectSearcher. Так, инструкция

([wmisearcher] "select * from win32_ service where state='stopped'").get ()

возвращает коллекцию, содержащую данные об остановленных службах Win32. Те же результаты можно получить с помощью составной команды Get-WmiObject с параметром -query, как в следующем фрагменте кода

Get-WmiObject -query "select * from win32_service where state='stopped'"

Как мы видим, по длине эти инструкции мало отличаются друг от друга, так что ускоритель типов, пожалуй, не сокращает числа вводимых символов. Но он дает возможность обращаться к свойствам ReturnImmediately и Timeout класса EnumerationOptions (с использованием свойства Options класса ManagementObjectSearcher), которые можно использовать для решения проблем с запросами, связанных с окончанием периода ожидания.

Карен Бемовски (kbemowski@windowsitpro.com) — редактор Windows IT Pro


Другие типы ускорителей

Наряду с типами [wmi], [wmiclass] и [wmisearcher], в оболочке PowerShell существуют и другие типы ускорителей. К примеру, в пакете PowerShell 1.0 реализован ускоритель типов [adsi], который позволяет легко обращаться к классу .DirectoryEntry платформы Windows.NET Framework в пространстве имен System.DirectoryServices. А версия PowerShell 2.0 будет включать в себя новый ускоритель типов [adsisearcher], который позволит без труда обращаться к классу DirectorySearcher в пространстве имен System.DirectoryServices.