PowerShell – это объектно-ориентированный язык. Когда вы запускаете команды, видите вывод на экране, это объекты. Объекты не возникают из воздуха; разработчики создают их или, более конкретно, создают экземпляры с помощью классов. Классы PowerShell представляют собой определения или схемы этих объектов.
Хотя вам может быть знакомо создание объектов с помощью команд, таких как New-Object
, и использование ускорителя типа pscustomobject
, это не “новые” объекты. Виды объектов, которые производят эти методы, являются определенными типами. Классы PowerShell определяют тип.
В этом руководстве вы узнаете, как начать работу с классами PowerShell. Вы создадите свой первый класс с конструкторами, узнаете, как создавать объекты из своего класса, и настроите свой класс с помощью свойств и методов.
Для изучения основных терминов, таких как объекты, свойства и методы, ознакомьтесь с сообщением в блоге Назад к основам: Понимание объектов PowerShell.
Предварительные требования
Создание Вашего первого класса и объекта
Прежде чем изучать основы класса PowerShell, сначала пройдите создание простого класса. Более сложные темы вы изучите позже.
Создание вашего первого класса будет немного напоминать создание функции. Базовый синтаксис тот же. Класс создается из определения, как и функция. В отличие от функций, первая строка не начинается с function
, за которым следует имя функции, она начинается с class
, за которым следует имя вашего типа объекта.
Ниже вы увидите пустую оболочку класса с именем student.
У классов есть свойства, которые выглядят как параметры, которые являются атрибутами, описывающими этот класс. Приведенный ниже пример показывает класс с именем student с двумя свойствами; FirstName
и LastName
.
При определении свойства всегда следует определять тип, который устанавливает конкретную “схему” того, какие значения свойства могут содержать. В приведенном ниже примере оба свойства определены как строки.
Всегда следует определять типы свойств. Вы поймете почему позже.
После определения класса создается объект из него или инстанциируется объект. Есть несколько способов создания объектов из классов; один из общих способов – использовать ускорители типа, такие как [student]
, которые представляют класс, за которыми следует стандартный метод, который поставляется с каждым классом и называется new()
.
Использование сокращения ускорителя типа такое же, как создание объекта с использованием команды New-Object
.
Как только вы создали объект из этого класса, присвойте значения свойствам. Приведенный ниже пример присваивает значения Tyler
и Muir
свойствам FirstName
и LastName
.
Как только вы создали объект и присвоили значения свойствам, проверьте объект, вызвав переменную, к которой вы присвоили объект, как показано ниже.

Теперь, когда вы создали объект из класса, передайте этот объект, как и любой другой объект в PowerShell, в cmdlet Get-Member
, чтобы его проверить. Ниже вы можете видеть объект, хранимый в переменной $student1
, типа student.
Имя класса всегда будет соответствовать типу объекта.
Обратите внимание, что Get-Member
возвращает четыре метода и два свойства. Свойства, вероятно, вам знакомы, но методы – нет. PowerShell добавляет определенные методы по умолчанию, но вы можете добавлять свои собственные методы или даже изменять методы по умолчанию.

Создание методов
В приведенном выше примере вы видели несколько методов по умолчанию для объекта, но, скорее всего, вам захочется создать свои собственные. Для этого вы должны определить один или несколько методов внутри определения класса.
A method definition looks like below with an output type that defines what type of object is returned from this method, the name of the method, and the code to execute inside of a scriptblock.
Обратите внимание на скобки ()
после имени. Здесь вы можете определить параметры метода (рассмотрим позже). Параметры метода позволяют изменять функциональность метода, так же как вы можете это сделать с параметрами функции.
Если вы ранее писали и запускали функции PowerShell, то метод scriptblocks должен быть вам знаком, но есть несколько особых правил, которые вы должны знать о методах.
Команда return
обязательна
Функции PowerShell возвращают объекты, просто помещая объект в любое место функции, как показано в примере ниже.
Однако, в отличие от функций, если метод возвращает объект, вы должны использовать конструкцию return
, как показано ниже.
Использование переменной $this
Еще одно отличие методов от функций – это переменная $this
. Переменная $this
, определенная внутри метода, ссылается на свойства или другие методы текущего объекта.
Ниже приведен пример метода с именем GetName()
, добавленного к классу student
, который объединяет значения свойств FirstName
и LastName
и возвращает их.
Теперь вы можете вызвать метод GetName()
, используя точечную нотацию, как показано ниже. Если вы ранее присвоили значения переменным FirstName
и LastName
, метод GetName()
вернет их.

Добавление параметров к методам
В приведенном выше примере, при выполнении строки $student1.GetName()
вы вызывали метод GetName()
как есть. Внутри скобок вы можете определить параметры, как в функциях.
Метод GetName()
просто возвращал любые значения, установленные для свойств FirstName
и LastName
. Но что если вы бы предпочли иметь метод для установки свойств, которые потом будет получать GetName()
? В этом случае вам нужно определить параметры метода.
Определите параметры метода, включив один или несколько параметров, разделенных запятой, в скобках параметров метода, как показано ниже.
Обратите внимание на тип вывода
[void]
. Когда метод ничего не возвращает, не нужно использовать конструкциюreturn
, и вы должны определить тип вывода как[void]
, чтобы сообщить PowerShell, что метод ничего не возвращает.
Например, возможно, метод SetName()
принимает полное имя (имя и фамилию). Если это так, то в блоке скрипта вы можете разделить эту строку и присвоить имя и фамилию таким образом.
Вставив метод SetName()
в класс student
, вот как он выглядит сейчас.
Теперь вы можете передать полное имя в качестве параметра методу SetName()
, который устанавливает свойства текущего объекта FirstName
и LastName
.

Перегрузка методов
Возможно, вам хотелось бы определить разные наборы параметров для метода. Подобно тому, как наборы параметров работают в функциях и командлетах, вы можете определить разные «контексты» параметров или сигнатуры метода.
Возможно, вам бы хотелось установить параметры FirstName
и LastName
, передавая полное имя в метод SetName()
или передавая имя и фамилию отдельно. Вам не нужно выбирать; вы можете определить их оба с помощью сигнатур методов.
Когда вы определяете более одной сигнатуры методов в классе, это называется перегрузкой.
Используя пример из предыдущего раздела, вы можете создать перегрузку для метода SetName()
, чтобы он принимал две строки вместо одной. Когда вы передаете две строки вместо одной, метод SetName()
предполагает, что первая строка – это FirstName
, а вторая строка – это LastName
. C этой перегрузкой класс будет выглядеть следующим образом.

Конструкторы классов
Всякий раз, когда вы создаете объект с помощью метода new()
или другим способом, вы можете указать PowerShell выполнить некоторый пользовательский код, называемый конструктором. Конструкторы похожи на методы, но они выполняются автоматически, когда PowerShell создает экземпляр объекта.
У каждого класса есть конструктор по умолчанию. Этот конструктор по умолчанию не делает многое; его задача – только создать экземпляр объекта. Вы можете увидеть конструктор по умолчанию, просмотрев вывод метода New
. Ниже вы можете видеть, что эта строка возвращает единственный метод new()
.

Перегрузка конструктора
Возможно, вам захочется установить значение для свойств FirstName
и LastName
сразу после создания объекта, а не с помощью типичной точечной нотации. В таком случае вы можете создать конструктор с параметром, который затем вызывает SetName()
.
Ниже приведен пример конструктора для класса student
. Обратите внимание, что у конструктора нет определенного имени и он не имеет префикса с типом вывода. Конструкторы всегда используют тот же самый идентификатор, что и класс.
Вызов существующего метода в конструкторе позволяет нам повторно использовать метод, который мы уже написали для установки переменных.
А ниже вы увидите, что конструктор добавлен в класс student
.
Когда вы создаете новый объект student
и передаете строковый параметр, свойства объекта сразу получат ожидаемые значения.

Теперь вы можете увидеть перегруженный конструктор снова с помощью [student]::New
. Обратите внимание, что новый перегруженный конструктор определен с параметром Name
.

Определение стандартного и перегруженного конструктора
Теперь, когда у вас есть перегруженный конструктор в вашем классе student
, PowerShell перезаписывает стандартный конструктор. Но вы можете вернуть его, создав его вручную без параметров.
Вы можете увидеть, как это выглядит в классе student
ниже.
Теперь проверьте конструкторы снова. Теперь вы увидите, что оба конструктора появляются.

Наследование классов
Translated text to Russian:
Как и все другие объектно-ориентированные языки, вы можете иерархически создавать классы PowerShell с несколькими классами. Каждый класс может иметь “родительские” и “дочерние” классы, начиная с менее конкретных, более общих целей и повышая специфичность.
Например, наш класс student
представляет собой студента университета (дочерний/конкретный). Этот студент – человек (родитель/общий). Эти два концепта связаны и формируют иерархию.
A child class can inherit a parent class which means it can hold all properties and methods (members) defined via a parent class. We know that a person
class may have properties like eye_color
, height
, and weight
and perhaps a method called SetHeight()
.
Если студент – это человек, то у этого студента все равно есть те же свойства и методы. Было бы избыточно реализовывать те же самые элементы в классе student
, которые уже есть в классе person
. Вы можете определить наследование класса, чтобы автоматически определить все элементы класса person
в классе student
.
Если это сейчас не имеет смысла, это прояснится, когда мы пройдем демонстрацию.
Демонстрация наследования классов
Сначала сделайте копию ранее созданного вами класса student
, удалите конструкторы и переименуйте его в класс person
. Ваш класс person
должен выглядеть как приведенный ниже класс.
A student, of course, has a first name and last name, but the class can be described more accurately by labeling it as a person. When creating a more “generic” class like this, you can create more specific “child” classes from it.
Теперь создайте несколько классов, представляющих человека, но с более конкретной ролью. Например, в следующем фрагменте кода у вас теперь есть классы teacher
и student
.
Как есть, классы teacher
и student
взаимно исключают друг друга из класса person
. Они не имеют отношения, но не могут унаследовать никаких элементов класса person
. Давайте это изменить.
Теперь определите эту иерархию, определив классы teacher
и student
как “дочерние” классы класса person
с использованием наследования. Вы можете определить наследование, добавив двоеточие (:
) после имени класса, за которым следует имя родительского класса, как показано ниже.
Весь ваш классовый скрипт теперь должен выглядеть следующим образом:
На данном этапе, при создании объекта из класса teacher
или student
, оба класса будут иметь те же члены, что и класс person
.

Наследование с конструкторами
Как вы видели выше, методы класса наследуются через классовое наследование. Это поведение может заставить вас подумать, что конструкторы следуют той же логике, но вы были бы неправы. Конструкторы не наследуются, и конструкторы для всех дочерних классов должны быть определены в каждом дочернем классе отдельно.
Например, предположим, что вы только что определили перегруженный конструктор для класса person
, но не определили конструктор для класса teacher
, как показано ниже.
Затем вы определяете дочерний класс, например, teacher
, и пытаетесь создать объект без параметров из него, как показано ниже. Обратите внимание, что PowerShell возвращает ошибку, потому что конструктор без параметров не был определен внутри класса teacher
.

A constructor is not necessary in a child class if you’re only using it as a template. Alternatively, if you want to use the parent class as its own standalone class and as a parent class you can include constructors. But you have to make sure that the parent class has a constructor that matches the ones in the child classes.
Атрибуты члена класса
Как и параметры команд PowerShell, у классов могут быть атрибуты члена. Эти атрибуты изменяют поведение каждого члена.
Скрытые члены
Если вы используете член класса только для внутренних целей и не хотите, чтобы пользователь читал или записывал в него, вы можете скрыть его. Например, у вас может быть метод, который используется только другими методами. Нет необходимости показывать этот метод пользователю.
Чтобы определить скрытый член, используйте атрибут hidden
, как показано ниже.
Теперь, когда вы используете Get-Member
, чтобы просмотреть все члены объекта, этот свойство не отображается.

Установка члена класса как скрытого не ограничивает доступ к значению, она только скрывает его от просмотра. Не следует скрывать свойства для хранения конфиденциальных данных.
Статические члены
Напомним, что в предыдущих уроках использовалось термин “инстанцирование”, чтобы описать создание объекта из класса. Когда вы инстанцируете объект, этот объект принимает все свойства и методы, определенные в классе. Но это не всегда так.
Иногда вам не нужны накладные расходы на создание целого объекта. Вместо этого вам нужно быстро ссылаться на отдельный член класса. В этом случае вы можете установить член класса как статический.
Так же как с атрибутом hidden
, определите член класса как статический, используя ключевое слово static
, как показано ниже.
В отличие от обычных членов класса, PowerShell не создает свойства и методы из статических членов класса. Когда вы определяете член класса как статический, как скрытые члены, он не отображается при использовании Get-Member
.

Например, возможно, вам хотелось бы ассоциировать названия университетских классов с классом student
и определить максимальное количество университетских классов, в которых студент может участвовать. Для этого вы создаете член массива Classes
и член MaxClassCount
.
Поскольку пользователю редко нужно изменять член MaxClassCount
, вы решаете определить его как статический.
Наконец, вы создаете метод AddClass()
, чтобы добавить класс в расписание студента, но только если он меньше, чем MaxClassCount
.
Теперь, когда вы пытаетесь создать новый объект student
и назначить ему слишком много университетских классов, PowerShell назначит только максимальное количество, которое будет равно семи.

Вы можете изменить значения статических членов в любое время. Если, например, вы хотите сделать член
MaxClassCount
равным 5 вместо 7, вы бы изменили значение, используя[student]::MaxClassCount = 5
. Изменение значения не будет отменять классы, которые превышают лимит в этом примере.
Заключение
Классы PowerShell размывают границу между скриптовым и языком программирования. Классы – отличный способ определения отношений объектов, добавления способов взаимодействия и форматирования объектов, которые обычно были бы доступны только с помощью написания специализированных функций.