我想要能够确定和利用一个自定义的类型在一些我PowerShell脚本。例如,让我们假装我有一个需要一个对象,有以下结构:

Contact
{
    string First
    string Last
    string Phone
}

我怎么会去创造这样,我可以使用它的功能如下:

function PrintContact
{
    param( [Contact]$contact )
    "Customer Name is " + $contact.First + " " + $contact.Last
    "Customer Phone is " + $contact.Phone 
}

是这样的可能的,或者甚至建议在PowerShell?

有帮助吗?

解决方案

创造定义的类型可能做置。
Kirk蒙罗实际上有两个很大的职位的详细过程。

这本书 问题行动,曼宁 还有一个代码样本,为创造一个领域特定的语言创建自定义的类型。这本书是优秀的所有四周,所以我真的建议。

如果你只是寻找一个快速的方式来做到以上,您可以创建一个功能创造该定义对象喜欢

function New-Person()
{
  param ($FirstName, $LastName, $Phone)

  $person = new-object PSObject

  $person | add-member -type NoteProperty -Name First -Value $FirstName
  $person | add-member -type NoteProperty -Name Last -Value $LastName
  $person | add-member -type NoteProperty -Name Phone -Value $Phone

  return $person
}

其他提示

前PowerShell3

PowerShell的可扩展类型系统最初没有让你创造的具体类型的你可以试验对你有没有在你的参数。如果你不需要那个测试,你没事的任何其他方法。

如果你想要一个实际类型的你可以投给或类型的检查,作为在你的剧本...它的 不能 必须写在C#或VB.net 和编译。在PowerShell2,可以使用的"添加型"的命令这样做相当马:

add-type @"
public struct contact {
   public string First;
   public string Last;
   public string Phone;
}
"@

历史的注意:在PowerShell1甚至更难。你必须手动使用CodeDom,有一个非常古老的功能 新结构 脚本PoshCode.org 这将有所帮助。你的例子变成:

New-Struct Contact @{
    First=[string];
    Last=[string];
    Phone=[string];
}

使用 Add-TypeNew-Struct 会让你真正测试的类 param([Contact]$contact) 并作出新的使用 $contact = new-object Contact 等等...

在PowerShell3

如果你不需要一个"真正的"类,可以转换为,你不要使用增加成员的办法, 史蒂芬和其他人已经证明 以上。

由于PowerShell2您可以使用的财产参数对新对象:

$Contact = New-Object PSObject -Property @{ First=""; Last=""; Phone="" }

在PowerShell3,我们有能力使用 PSCustomObject 促进剂添加一个TypeName:

[PSCustomObject]@{
    PSTypeName = "Contact"
    First = $First
    Last = $Last
    Phone = $Phone
}

你仍然只得到一个单一的对象,所以你应该做一个 New-Contact 功能,以确保每个对象出来的一样,但你现在可以很容易地确认参数"是"一项这些类型的装饰的参与 PSTypeName 属性:

function PrintContact
{
    param( [PSTypeName("Contact")]$contact )
    "Customer Name is " + $contact.First + " " + $contact.Last
    "Customer Phone is " + $contact.Phone 
}

在PowerShell5

在PowerShell5的一切变化,并且我们终于拿到了 classenum 如语言,关键词用于限定种类(有没有 struct 但是,这的确定):

class Contact
{
    # Optionally, add attributes to prevent invalid values
    [ValidateNotNullOrEmpty()][string]$First
    [ValidateNotNullOrEmpty()][string]$Last
    [ValidateNotNullOrEmpty()][string]$Phone

    # optionally, have a constructor to 
    # force properties to be set:
    Contact($First, $Last, $Phone) {
       $this.First = $First
       $this.Last = $Last
       $this.Phone = $Phone
    }
}

我们还得到了一种新的方式来创建的对象不使用 New-Object: [Contact]::new() -事实上,如果你保持你的类简单和没有定义的构造,您可以创建的对象,通过浇铸hashtable(尽管没有一个构造,将无法强制执行的所有属性,必须设置):

class Contact
{
    # Optionally, add attributes to prevent invalid values
    [ValidateNotNullOrEmpty()][string]$First
    [ValidateNotNullOrEmpty()][string]$Last
    [ValidateNotNullOrEmpty()][string]$Phone
}

$C = [Contact]@{
   First = "Joel"
   Last = "Bennett"
}

这是快捷的方法:

$myPerson = "" | Select-Object First,Last,Phone

史蒂芬*穆拉夫斯基的回答是巨大的,但是我喜欢较短的(或者说刚才的更整洁的选择对象,而不是使用增加成员法):

function New-Person() {
  param ($FirstName, $LastName, $Phone)

  $person = new-object PSObject | select-object First, Last, Phone

  $person.First = $FirstName
  $person.Last = $LastName
  $person.Phone = $Phone

  return $person
}

惊讶没有人提到这个简单的选择(比3或以后),用于创建的定的对象:

[PSCustomObject]@{
    First = $First
    Last = $Last
    Phone = $Phone
}

本类型将PSCustomObject,而不是一个实际定义的类型。但它可能是最简单的方法,以创建一个自定义的对象。

有的概念PSObject和增加成员,你可以使用。

$contact = New-Object PSObject

$contact | Add-Member -memberType NoteProperty -name "First" -value "John"
$contact | Add-Member -memberType NoteProperty -name "Last" -value "Doe"
$contact | Add-Member -memberType NoteProperty -name "Phone" -value "123-4567"

这一产出,如:

[8] » $contact

First                                       Last                                       Phone
-----                                       ----                                       -----
John                                        Doe                                        123-4567

其他替代性(也就我所知道的)是界定一类C#/VB。净和负,会成PowerShell为直接使用。

这种行为是绝对鼓励的,因为它允许其他的脚本或部分的你的脚本中的工作的一个实际的对象。

这里是硬的路径,以创建自定义的类型,并将它们存储在一个集合。

$Collection = @()

$Object = New-Object -TypeName PSObject
$Object.PsObject.TypeNames.Add('MyCustomType.Contact.Detail')
Add-Member -InputObject $Object -memberType NoteProperty -name "First" -value "John"
Add-Member -InputObject $Object -memberType NoteProperty -name "Last" -value "Doe"
Add-Member -InputObject $Object -memberType NoteProperty -name "Phone" -value "123-4567"
$Collection += $Object

$Object = New-Object -TypeName PSObject
$Object.PsObject.TypeNames.Add('MyCustomType.Contact.Detail')
Add-Member -InputObject $Object -memberType NoteProperty -name "First" -value "Jeanne"
Add-Member -InputObject $Object -memberType NoteProperty -name "Last" -value "Doe"
Add-Member -InputObject $Object -memberType NoteProperty -name "Phone" -value "765-4321"
$Collection += $Object

Write-Ouput -InputObject $Collection
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top