Если вы никогда не слышали об ускорителях типов [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, представляющему службу 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, представляющему процесс 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.