我如何创建一个自定义中的类型PowerShell为我的脚本中使用?
-
09-06-2019 - |
题
我想要能够确定和利用一个自定义的类型在一些我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-Type
或 New-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的一切变化,并且我们终于拿到了 class
和 enum
如语言,关键词用于限定种类(有没有 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