如何在PowerShell中使用行为(方法)创建真实对象?

时间:2013-02-12 15:31:49

标签: c# powershell powershell-v2.0 powershell-v3.0

可能这个问题之前已经得到了回答......但我还没有找到满足我需求的具体答案。

BTW我正在使用PowerShell 3

嗯,我是PowerShell的新手,但我作为C#开发人员有很多经验,所以使用对象对我来说非常重要。

所以我想知道在PowerShell脚本中是否有干净方式来应用 OOP概念(并非所有这些概念都很棒),例如,我想做一些具体的事情。

注意:我知道我可以在PowerShell中编写C#代码来创建DTO,并且我可以在C#中创建PowerShell二进制模块,我过去已经这样做了,但我正在寻找现在能够在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();
    
  • 封装行为,这意味着在我的对象中创建函数,然后将它们标记为私有

  • [很高兴]。创建基类,以便我可以继承并专门化我的行为重写方法

  • [很高兴]。创建界面,这样我就可以开始考虑单独测试我的PowerShell方法了(我知道有像Pester这样的工具来做这个我只是专注在OOP功能上)

到目前为止,我所做的是仅创建具有属性的对象(DTO),但我想向我的对象添加行为

如果你们指出我正确的方向,我会很感激

3 个答案:

答案 0 :(得分:12)

使用方法创建对象的两个选项:

  1. 添加会员
  2. New-Module -AsCustomObject
  3. 代码示例:

    $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!'
        }
    
    }
    

    编辑:谈到私人/公共......在后一个示例中,属性不会“默认”出现。您可以使用Export-ModuleMember来决定公开内容,并指定将公开的-Variable(属性)和/或-Function(方法)。没有显式Export-ModuleMember,它的行为与“普通”模块中的相同 - 仅导出函数(方法)。

答案 1 :(得分:5)

如果您想要完整 OOP(包括继承,但不是接口),那么PSClass是MS-PL许可的实现。

答案 2 :(得分:4)

PowerShell v5引入了全班支持,可以轻松地使用属性和实现方法构建自己的类。

查看Trevor关于此主题的精彩博文。 Trevor Sullivan, Implementing a .net Class