.

Объекты PowerShell предусматривают единообразную структуру для работы с различными типами данных, независимо от источника. Другими словами, способы, с помощью которых вы управляете данными одного объекта, схожи со способами для управления данными другого объекта. Благодаря объектно-ориентированному характеру PowerShell можно не только воспользоваться объектами, в своей основе сгенерированными встроенными командами PowerShell, но также строить и собственные объекты на основе классов в платформе Microsoft. NET Framework. Несомненно, в работе с объектами, в том числе благодаря их неотъемлемому качеству – гибкости, PowerShell демонстрирует качества эффективного и масштабного инструментария.

Объектно-ориентированная структура PowerShell

. NET Framework – это программная структура, включающая объемную библиотеку различных типов классов. Эти классы служат фундаментом, на котором строятся объекты. NET, а также обеспечивают доступ к различным системам, сетям, папкам и ресурсам хранения. PowerShell построен на специализированных классах. NET, благодаря которым возможен доступ ко всей библиотеке классов. NET внутри среды PowerShell. Можно сказать, что эти объекты формируют фундамент, на котором строится PowerShell.

В окружение PowerShell встроена коллекция команд. Каждая команда выполняет определенную операцию, будь то получение списка файлов в папке или управление службой, запущенной на компьютере. Для выполнения такой операции команда создает объект или набор объектов на основе специализированных классов PowerShell. Объекты предусматривают средства для передачи данных по конвейеру, где они могут использоваться другими командами.

Каждый объект можно представить как пакет с соответствующей информацией. Например, объект может содержать данные, необходимые для описания файла: его имя, размер, местоположение и другие атрибуты. Для работы с данными объекта вы вызываете его элементы, которые являются компонентами, позволяющими получить доступ к информации и работать с ней. Объекты PowerShell поддерживают несколько типов элементов, из них два наиболее распространенные – это свойства и методы. Свойство – это именованное значение данных, которое описывает «элементы», представленные объектом. Это может быть размер файла или дата его создания. Методы – это действия, имеющие отношение к данным объекта, такие как удаление или перемещение файла.

Работа с объектами PowerShell

Как работать с объектами PowerShell, лучше всего рассмотреть на примере. Одна из команд, которую предоставляет PowerShell, Get-Service, возвращает список служб, установленных на компьютере. Команда, указанная без определенных параметров, выдает информацию о службах на локальном компьютере.

Каждая служба, возвращаемая командой Get-Service, является объектом на основе класса. NET System.ServiceProcess.ServiceController. Как и большинство объектов, ServiceController содержит многочисленные свойства и методы, которые могут пригодиться для доступа к данным внутри этого объекта или для выполнения операций с данными. Например, объект ServiceController включает свойства Name и DisplayName. Значение данных, связанное со свойством Name, обеспечивает фактическое имя службы. Значение данных, связанное со свойством DisplayName – отображаемое имя, используемое для данной службы. Объект ServiceController также включает ряд методов. Например, вы можете использовать метод Start для запуска службы, представленной объектом, или метод Stop, чтобы остановить работу службы.

Вам не обязательно досконально знать каждое свойство, метод или другой тип элемента, связанный с объектом. В PowerShell предусмотрена команда Get-Member – удобный инструмент для доступа к информации о каждом из элементов, поддерживаемых объектом. Данная команда будет полезна для получения информации обо всех элементах или определенных типах элементов. Для получения информации обо всех элементах, прежде всего, необходимо указать команду, о которой вы хотите узнать и затем воспользоваться командой Get-Member. Разделите две команды вертикальной чертой (символ конвейера команд), как показано ниже:

Get-Service | Get-Member

В данном случае команда направляет по конвейеру объект, возвращаемый командой Get-Service, команде Get-Member. Выполнив команду, вы получите результаты, которые представлены на экране 1.

 

Получение информации о команде Get-Service
Экран 1. Получение информации о команде Get-Service

Как мы видим, в списке содержится имя каждого элемента, тип элемента и определение, которое может быть значимо или нет, в зависимости от ваших задач программирования. В любом случае очевидно, что объект ServiceController поддерживает ряд элементов, в большинстве своем методы и свойства. Подробнее о различных типах элементов рассказано в статье MSDN «PSMemberTypes Enumeration» (msdn.microsoft.com/en-us/library/windows/desktop/system.management.automation.psmembertypes%28v=vs.85%29.aspx)

Обратите внимание, что результаты, возвращаемые командой Get-Member, начинаются с указания имен типа класса, на которых основан объект — в данном случае, System.ServiceProcess.ServiceController. Наличие данной информации может оказаться полезным, если вы знакомы с классами. NET и хотите еще лучше освоить выполняемые операции. Еще один плюс заключается в том, что вы будете точно знать, что работаете с нужным типом объекта. Здесь мы подходим к еще одному аспекту информации, возвращаемой командой Get-Member. Как вы уже заметили, результаты включают информацию лишь об одном объекте, хотя команда Get-Service возвращает объект для каждой службы. Когда команда Get-Member видит, что возвращается множество объектов одного типа, она включает только один экземпляр этих объектов, чтобы избежать избыточности. Можно также сказать, что она возвращает только класс, на котором основаны все эти объекты.

Однако если команда возвращает более одного типа объектов, Get-Member возвращает информацию о каждом из типов. Например, если вы запускаете команду Get-ChildItem для просмотра папки, содержащей как файлы, так и другие папки, Get-Member будет возвращать информацию о классе System.IO.DirectoryInfo и классе System.IO.FileInfo. Вместе с тем, если папка содержит лишь файлы, Get-Member возвращает информацию только о System.IO.FileInfo. Таким образом, работая с Get-Member, вы должны убедиться, что просматриваете нужные типы объектов.

Команда Get-Member также позволяет увидеть список типов, таких как свойства и методы. Для этого необходимо включить параметр -MemberType, а затем указать имя типа. Например, следующая команда указывает, что возвращаются только свойства объекта:

Get-Service | Get-Member -MemberType Property

Возможность получить подробную информацию об элементе объекта, будь то все элементы или определенный тип элемента, облегчает доступ к указанной информации внутри данного объекта. Например, теперь вы знаете, что класс ServiceController поддерживает свойства Status и ServiceType. Используйте эту информацию внутри команды, чтобы уточнить свои операции. Так, следующая команда использует названные свойства с командой Where-Object для фильтрации результатов:

Get-Service | Where-Object {$_.Status -eq «Running» `
-and $_.ServiceType -eq «Win32OwnProcess»}

В данной команде результат Get-Service (то есть набор объектов ServiceController) передается по конвейеру команде Where-Object. Вам будут доступны свойства каждого объекта, переданного команде Where-Object, чтобы создать фильтры. Для этого сначала укажите символ $_ — системная переменная, указывающая на актуальный объект в конвейере — следом за точкой и именем свойства. Вы можете использовать эти свойства для возвращения указанных данных, определив логическое выражение: true (истина) или false (ложь). В данном случае сначала вы указываете свойство Status, которое должно иметь значение Running и свойство ServiceType со значением Win32OwnProcess для возвращения данных объекта. Обратите внимание, что оператор сравнения -eq используется для оператора эквивалентности, а оператор -and объединяет два выражения. Таким образом, оба условия должны быть истинными (true), для того чтобы объект был возвращен. Также обратите внимание на обратную кавычку (back tick) (`) в первой строке. Так обозначается продолжение кода на следующей строке. На экране 2 показаны возвращаемые командой результаты.

 

Получение подробной информации об объекте
Экран 2. Получение подробной информации об объекте

Службы, работающие на моей системе, отвечают требованиям Where-Object, то есть службы выполняются и имеют тип службы Win32OwnProcess. Обратите внимание, что я запускаю PowerShell в виртуальной среде Windows 7.

Зная имена свойств, поддерживаемых объектом ServiceController, можно без труда найти нужную информацию. Чтобы результаты читались лучше, вы можете выполнить следующее действие:

Get-Service | Where-Object {$_.Status -eq «Running» `
-and $_.ServiceType -eq «Win32OwnProcess»} |
Format-Table -Autosize

Даже если исходный пример уже вывел информацию в виде таблицы, команда Format-Table позволяет включить параметр -Autosize, как показано на экране 3.

 

Форматирование вывода командой Format-Table
Экран 3. Форматирование вывода командой Format-Table

Теперь давайте рассмотрим другие возможности для просмотра элементов объекта. Начнем с возвращения информации о конкретной службе, MsDtsServer110, которая используется для запуска SQL Server Integration Services (SSIS). Для получения информации применяйте параметр -Name команды Get-Service, чтобы указать имя службы:

Get-Service -Name MsDtsServer110 | Format-List

Передавая по конвейеру результаты команды Get-Service команде Format-List, вы увидите значения свойств, связанные с данным объектом ServiceController, как показано на экране 4.

 

Значения свойств, связанные с объектом ServiceController
Экран 4. Значения свойств, связанные с объектом ServiceController

PowerShell также позволяет получить доступ к значениям указанных свойств внутри объекта. Для примера предположим, что вам нужно только узнать значение свойства Status, связанного со службой MsDtsServer110. Сделать это можно, вызвав команду Format-Wide с указанием параметра -Property:

Get-Service -Name MsDtsServer110 |
Format-Wide -Property Status

В этом случае команда возвращает только значение Stopped, связанное со свойством Status службы. Кроме того, вы можете получить доступ к объекту ServiceController и его свойству напрямую:

(Get-Service -Name MsDtsServer110).Status

Обратите внимание, что команда Get-Service заключена в скобки. Это необходимо сделать, поскольку без них PowerShell будет рассматривать MsDtsServer110.Status как полное имя службы, а не как имя службы со свойством Status. Скобки заставляют PowerShell сначала выполнить команду, генерирующую объект ServiceController. Затем PowerShell извлекает свойство Status из данного объекта. Опять же команда возвращает значение Stopped.

Этого же результата вы можете достичь и другим способом: назначить выведенный объект ServiceController переменной, а затем использовать эту переменную для вызова значения свойства:

$ssis = Get-Service -Name MsDtsServer110
$ssis.Status

Как мы видим, определена переменная $ssis, и результат Get-Service присваивается в качестве значения. В этом случае не нужно заключать команду Get-Service в скобки. Свойства не вызываются, так что нет никакой путаницы в том, что именно присваивается переменной. Работа команды заключается в создании объекта ServiceController, и этот объект становится значением переменной. Затем вы можете использовать переменную $ssis, чтобы указать на свойство Status объекта ServiceController, добавив точку и имя свойства. Как и две другие команды, эта команда возвращает значение Stopped.

Вы не ограничены лишь свойством Status. Используя переменную $ssis, вы можете получить доступ к значениям любых других свойств. Например, следующая команда задействует переменную $ssis для доступа к свойству DisplayName:

$ssis.DisplayName

Эта команда возвращает значение SQL Server Integration Services 11.0.

Важно отметить, что назначение объекта переменной в этот момент блокирует данные. Например, если статус службы изменится, свойство Status переменной не будет отражать измененный статус, потому что исходные данные уже были назначены данному объекту.

Тем не менее, это не мешает использовать методы переменной, чтобы предпринимать действия в отношении службы. Но для начала просмотрите список доступных методов. Для этого направьте по конвейеру содержимое переменной $ssis команде Get-Member, указав в качестве типа элемента Method:

$ssis | Get-Member -MemberType Method

Как и следует ожидать, команда возвращает список методов, связанных с объектом ServiceController — в этом случае объект создан для службы MsDtsServer110. Затем вы можете задействовать переменную $ssis для вызова любого из этих методов. Например, следующая команда запускает работу службы MsDtsServer110:

$ssis.Start()

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

$ssis.Stop()

Таким образом, понимание принципов работы с объектами, которые генерируют команды, может помочь вам использовать PowerShell более эффективно. PowerShell не предусматривает команд для каждого. NET-класса, но вам может понадобиться задействовать один из классов, чтобы выполнить определенную операцию. В подобных случаях вы можете создавать собственные объекты на основе данных классов.

Создание объекта. NET в PowerShell

Платформа. NET Framework и ее библиотека классов предусматривает полный набор классов для выполнения широкого диапазона операций. Хотя встроенный набор команд PowerShell весьма полезен для доступа к классам, не все соответствующие операции могут быть выполнены. По этой причине PowerShell включает команду New-Object, чтобы вы могли создать собственный объект.

Также стоит заметить, что наряду с созданием объектов на основе классов. NET, PowerShell позволяет создавать модули,. NET-классы (типы), а также объекты Component Object Model (COM). Разбор этих типов объектов остается за рамками данной статьи, но вы должны знать, что возможности PowerShell выходят далеко за пределы того, что я смог вам показать здесь.

Чтобы создать объект на основе класса. NET, нужно задать команду New-Object, а затем указать параметр -TypeName и имя класса. В большинстве случаев проще всего назначить новый объект переменной, которую в дальнейшем можно использовать для доступа к элементам объекта. В следующем примере мы создаем объект на основе. NET-класса System.Net.NetworkInformation.Ping и назначаем его переменной $ping:

$ping = New-Object -TypeName Net.NetworkInformation.Ping

Обратите внимание, что при создании объекта вам не нужно определять System. PowerShell знает, где искать класс.

Это все, что нам необходимо для создания объекта. Вы можете получить доступ к элементам объекта с помощью переменной $ping. В этом случае для просмотра элементов объекта вам нужно передать по конвейеру содержимое переменной команде Get-Member:

$ping | Get-Member

На экране 5 видно, что результаты показывают элементы объекта, возвращаемого командой Get-Member.

 

Элементы вновь созданного объекта
Экран 5. Элементы вновь созданного объекта

Как вы и ожидаете, объект основан на классе System.Net.NetworkInformation.Ping. Обратите внимание, что класс поддерживает ряд методов, один из которых – Send. Давайте подробнее рассмотрим метод с использованием команды Get-Member для возвращения более подробной информации:

$ping | Get-Member -Name Send | Format-List

Это означает, что вы применяете команду Get-Member с параметром –Name, а затем метод Send. После этого вы направляете по конвейеру информацию, полученную от Get-Member, команде Format-List, которая возвращает результаты, показанные на экране 6.

 

Более подробная информация о новом объекте
Экран 6. Более подробная информация о новом объекте

Хотя описание довольно широкое, в сущности, оно показывает, что метод позволяет вам опрашивать определенные веб-сайты или IP-адреса, как указано в части, которую считывает Send(string hostNameOrAddress). В следующем примере метод Send опрашивает google.com:

$ping.Send(«google.com»)

В этом случае метод Send возвращает результаты, показанные на экране 7.

 

Результаты работы метода Send
Экран 7. Результаты работы метода Send

Хотя это очень простой пример применения объектов, созданных на основе. NET-классов, он демонстрирует, что вы не ограничены в получении необходимой информации. Теперь вы многое знаете о различных классах, доступных в. NET, но вам, конечно же, не нужно быть экспертом в разработке. NET, чтобы эффективно использовать это свойство в PowerShell.

Объектно-ориентированный мир PowerShell

Объекты – это корень всех операций PowerShell. Чем лучше вы понимаете, как работают объекты в среде PowerShell, тем эффективнее будете использовать гибкость PowerShell и выполнять множество задач с поддержкой PowerShell. Вы сможете не только в полной мере применять команды PowerShell, но и создавать собственные объекты, а значит, использовать свои системы и сети более продуктивно. Эта статья охватывает лишь малую часть того, что можно делать с объектами в PowerShell. Объекты открывают перед вами перспективы освоения платформы. NET Framework и новые горизонты знаний, выходящие за пределы данной модели.