Как создать реальные объекты с поведением (методами) в PowerShell?

вероятно, на этот вопрос уже был дан ответ.... но я не нашел конкретного ответа на мои потребности.

кстати, я использую PowerShell 3

Ну, я новичок в PowerShell, но у меня много опыта в качестве разработчика C#, поэтому работа с объектами очень важна для меня.

поэтому мне интересно, есть ли чисто применить концепции ООП (ну, не все из них, хотя это было бы потрясающе) в сценарии PowerShell, для например, есть конкретные вещи, которые я хотел бы сделать.

примечание: Я знаю, что я могу написать код C# в PowerShell для создания DTO, а также что я могу создавать двоичные модули PowerShell в C#, я делал это в прошлом, но то, что я ищу сейчас, - это возможность написать весь мой код в PowerShell, но в объектно-ориентированный путь.

вещи, которые я хотел бы сделать:

  • создайте объект в PowerShell и предоставьте функцию, написанную в PowerShell, а также что-то вроде этого:

    function New-Person
    (
        [Parameter()][string]$firstName
    )
    {
        function Walk()
        {
            Write-Host "Walking...";
        }
    
        $person = New-Object psobject;
    
        $person | Add-Member -MemberType NoteProperty -Name FirstName -Value $firstName;
    
        #This line does not work
        #$person | Add-Member -MemberType CodeMethod -Name Walk -Value Walk;
    
        return $person;
    }
    
    $MyPerson = New-Person -firstName "JP";
    
    $MyPerson;
    
    #This line does not work
    $MyPerson.Walk();
    
  • инкапсулировать поведение, что означает создание функций внутри моего объекта, а затем пометить их как private

  • [приятно]. создайте базовые классы, чтобы я мог наследовать и специализировать методы переопределения поведения

  • [приятно]. создайте интерфейсы, чтобы я мог начать думать в модульном тестировании в изоляция моих методов PowerShell (я знаю, что есть такие инструменты, как Pester, чтобы сделать это, я просто фокусируюсь на функциях OOP)

что я сделал до сих пор составляет создание объектов только со свойствами (DTO) но я хотел бы добавить поведение к моим объектам

Я был бы признателен, если бы вы, ребята, указали мне в правильном направлении

3 ответов


два варианта создания объекта с помощью методов:

  1. Add-Member
  2. New-Module-AsCustomObject

примеры кода:

$person | Add-Member -MemberType ScriptMethod -Value {
    'I do stuff!'
}

$person = New-Module -AsCustomObject -ScriptBlock {
    $Property = 'value'
    [string]$Other = 'Can be strongly typed'

    function MyMethod {
        'I do stuff!'
    }

}

EDIT: говоря о частном / общественном... В последнем примере свойство не будет отображаться "по умолчанию". Вы можете решить, что такое public using Export-ModuleMember и указать -Variable (свойства) и/или -Function (методы), которые будут общедоступными. Без явного Export-ModuleMember он будет вести себя так же, как в "нормальной модуль" - экспорт только функции (методы).


Если вы хотите полное OOP (включая наследование, хотя и не интерфейсы), затем PSClass является лицензированной реализацией MS-PL.


PowerShell v5 предоставляет полную поддержку классов, что упрощает создание собственных классов со свойствами и методами реализации.

Проверьте большой пост Тревора в блоге о теме здесь. Тревор Салливан, реализующий класс .net