使用模块中的方法模拟类

时间:2016-03-11 14:49:46

标签: oop powershell powershell-v2.0

我正在使用PowerShell 2.0(无法升级),我正在编写一系列使用Active Directory中的一些信息的脚本。来自像C ++这样的OOP语言,我想在PowerShell 2.0中模拟一个类,但我知道它们在5.0中只有 class 语句,而且我不想使用C#来嵌入类因为我已经有了一个用Powershell编写的函数(这将是我的方法)..

我读到了这个:Powershell. Create a class file to hold Custom Objects?

我能够创建一个用#34;成员"创建PSObject的函数,但不知道如何使它与方法一起工作,这样我就可以在我的脚本中加载函数以获得更清晰的代码

这是我到目前为止所做的:

function New-User {

    param($user,
         $headers = @("header1","header2","header3","header4") )

    $new_user = New-Object -TypeName PSObject
    foreach ($header in $headers){
        $new_user | Add-Member -membertype NoteProperty -name $header -value $user.$header
    }
   $new_user | Add-Member -membertype NoteProperty -name "othermember" -value ""
   $new_user.PSObject.Typenames.Insert(0,"AD-User")

   # Add methods here! for example:
   $new_user | Add-Member -membertype METHOD -name "othermember" -value     MYDEFINED_FUNCTION($new_user.header1)


   return $new_user

}

我如何才能这样做才能在我的脚本中加载此功能?

谢谢!

1 个答案:

答案 0 :(得分:0)

ScriptMethod可以填补你在这里寻找的空白。假设对象具有firstnamelastname的属性,您可以执行类似的操作。

$new_user | Add-Member -membertype ScriptMethod -name samaccountname -value  {$this.firstname.substring(0,1) + $this.LastName}

然后使用返回的对象,您可以调用scriptmethod samaccountname

$matt = New-Object -TypeName psobject -Property @{
    firstname = "matt"
    lastname = "bagel"
}

$new = new-user $matt "firstname","lastname"
$new.samaccountname()

哪会返回" mbagel"。这是在2.0上测试的。

因此,如果你想在方法中使用一个函数,只需要确保它在被调用之前被提取。

function Get-AccoutName{
    param(
        [string]$firstname,
        [string]$lastname
    )

    $firstname.substring(0,1) + $lastname
}
.....
other code you have
.....
$new_user | Add-Member -membertype ScriptMethod -name samaccountname -value  {Get-AccoutName $this.firstname $this.LastName}

如果您希望这些内容始终可用,则只需将它们加载到PowerShell配置文件中即可。