Add-Member
将自定义属性和方法添加到 PowerShell 对象的实例。
语法
Add-Member
-InputObject <PSObject>
-TypeName <String>
[-PassThru]
[<CommonParameters>]
Add-Member
[-NotePropertyMembers] <IDictionary>
-InputObject <PSObject>
[-TypeName <String>]
[-Force]
[-PassThru]
[<CommonParameters>]
Add-Member
[-NotePropertyName] <String>
[-NotePropertyValue] <Object>
-InputObject <PSObject>
[-TypeName <String>]
[-Force]
[-PassThru]
[<CommonParameters>]
Add-Member
[-MemberType] <PSMemberTypes>
[-Name] <String>
[[-Value] <Object>]
[[-SecondValue] <Object>]
-InputObject <PSObject>
[-TypeName <String>]
[-Force]
[-PassThru]
[<CommonParameters>]
说明
Add-Member
cmdlet 允许将成员(属性和方法)添加到 PowerShell 对象的实例。 例如,可以添加一个 NoteProperty 成员,其中包含对象的说明或运行脚本以更改对象的 ScriptMethod 成员。
若要使用 Add-Member
,请通过管道将对象传递给 Add-Member
,或使用 InputObject 参数指定对象。
MemberType 参数指示要添加的成员的类型。 Name 参数将名称分配给新成员,Value 参数设置成员的值。
添加的属性和方法仅添加到指定的对象的特定实例。
Add-Member
不会更改对象类型。 若要创建新的对象类型,请使用 Add-Type
cmdlet。
还可以使用 Export-Clixml
cmdlet 将对象实例(包括附加成员)保存在文件中。 然后,可以使用 Import-Clixml
cmdlet 从导出文件中存储的信息重新创建对象的实例。
从 Windows PowerShell 3.0 开始,Add-Member
具有新功能,以便更轻松地向对象添加笔记属性。
可以使用 NotePropertyName 和 NotePropertyValue 参数来定义注释属性或使用 NotePropertyMembers 参数,该参数采用注释属性名称和值的哈希表。
此外,从 Windows PowerShell 3.0 开始,PassThru 参数(生成输出对象的)频率较低。
Add-Member
现在直接将新成员添加到更多类型的输入对象。 有关详细信息,请参阅 PassThru 参数说明。
示例
示例 1:向 PSObject 添加备注属性
以下示例向表示 Test.txt
文件的 FileInfo 对象添加值为“Done”的 Status note 属性。
第一个命令使用 Get-ChildItem
cmdlet 获取表示 Test.txt
文件的 FileInfo 对象。 它将保存在 $a
变量中。
第二个命令将 note 属性添加到 $a
中的对象。
第三个命令使用点表示法获取 $a
中对象的 Status 属性的值。 如输出所示,值为“Done”。
$A = Get-ChildItem c:\ps-test\test.txt
$A | Add-Member -NotePropertyName Status -NotePropertyValue Done
$A.Status
Done
示例 2:向 PSObject 添加别名属性
以下示例将 Size 别名属性添加到表示 Test.txt
文件的对象。 新属性是 Length 属性的别名。
第一个命令使用 Get-ChildItem
cmdlet 获取 Test.txt
FileInfo 对象。
第二个命令添加 Size 别名属性。 第三个命令使用点表示法获取新 Size 属性的值。
$A = Get-ChildItem C:\Temp\test.txt
$A | Add-Member -MemberType AliasProperty -Name Size -Value Length
$A.Size
2394
示例 3:向字符串添加 StringUse 注释属性
此示例将 StringUse note 属性添加到字符串中。
由于
此示例使用 NotePropertyMembers 参数。 NotePropertyMembers 参数的值是哈希表。 键是 note 属性名称,StringUse,值为 note 属性值,Display。
$A = "A string"
$A = $A | Add-Member -NotePropertyMembers @{StringUse="Display"} -PassThru
$A.StringUse
Display
示例 4:向 FileInfo 对象添加脚本方法
此示例将 SizeInMB 脚本方法添加到 FileInfo 对象,该对象将文件大小计算为最近的 MegaByte。 第二个命令创建一个 ScriptBlock,该脚本块使用 Round 静态方法从 [math]
类型将文件大小舍入到第二个小数位。
Value 参数还使用表示当前对象的 $This
自动变量。
$This
变量仅在定义新属性和方法的脚本块中有效。
最后一个命令使用点表示法对 $A
变量中的对象调用新的 SizeInMB 脚本方法。
$A = Get-ChildItem C:\Temp\test.txt
$S = {[math]::Round(($this.Length / 1MB), 2)}
$A | Add-Member -MemberType ScriptMethod -Name "SizeInMB" -Value $S
$A.SizeInMB()
0.43
示例 5:将对象的所有属性复制到另一个对象
此函数将一个对象的所有属性复制到另一个对象。
foreach
循环中的命令在每个属性上都以序列形式执行。
Add-Member
命令将 From 对象的属性作为 NoteProperty添加到 to 对象。 使用 Value 参数复制值。 它使用 Force 参数添加具有相同成员名称的成员。
function Copy-Property ($From, $To)
{
$properties = Get-Member -InputObject $From -MemberType Property
foreach ($p in $properties)
{
$To | Add-Member -MemberType NoteProperty -Name $p.Name -Value $From.$($p.Name) -Force
}
}
示例 6:创建自定义对象
此示例创建 资产 自定义对象。
New-Object
cmdlet 创建 PSObject。 该示例将 PSObject 保存在 $Asset
变量中。
第二个命令使用 [ordered]
类型加速器来创建名称和值的有序字典。 该命令将结果保存在 $D
变量中。
第三个命令使用 Add-Member
cmdlet 的 NotePropertyMembers 参数将 $D
变量中的字典添加到 PSObject。
TypeName 属性将新名称 资产分配给 PSObject。
最后一个命令将新的 Asset 对象传递给 Get-Member
cmdlet。 输出显示对象的类型名称为 Asset,以及我们在有序字典中定义的注释属性。
$Asset = New-Object -TypeName PSObject
$d = [ordered]@{Name="Server30";System="Server Core";PSVersion="4.0"}
$Asset | Add-Member -NotePropertyMembers $d -TypeName Asset
$Asset | Get-Member
TypeName: Asset
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Name NoteProperty System.String Name=Server30
PSVersion NoteProperty System.String PSVersion=4.0
System NoteProperty System.String System=Server Core
参数
-Force
指示此 cmdlet 会添加新成员,即使对象具有具有相同名称的自定义成员。 不能使用 Force 参数替换类型的标准成员。
类型: | SwitchParameter |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-InputObject
指定将新成员添加到的对象。 输入包含对象的变量,或键入获取对象的命令或表达式。
类型: | PSObject |
Position: | Named |
默认值: | None |
必需: | True |
接受管道输入: | True |
接受通配符: | False |
-MemberType
指定要添加的成员的类型。 此参数是必需的。 此参数的可接受值为:
- NoteProperty
- AliasProperty
- ScriptProperty
- CodeProperty
- ScriptMethod
- CodeMethod
有关这些值的信息,请参阅 MSDN 库中 PSMemberTypes 枚举。
并非所有对象都具有每种类型的成员。 如果指定对象没有的成员类型,PowerShell 将返回错误。
类型: | PSMemberTypes |
别名: | Type |
接受的值: | AliasProperty, CodeProperty, Property, NoteProperty, ScriptProperty, Properties, PropertySet, Method, CodeMethod, ScriptMethod, Methods, ParameterizedProperty, MemberSet, Event, Dynamic, All |
Position: | 0 |
默认值: | None |
必需: | True |
接受管道输入: | False |
接受通配符: | False |
-Name
指定此 cmdlet 添加的成员的名称。
类型: | String |
Position: | 1 |
默认值: | None |
必需: | True |
接受管道输入: | False |
接受通配符: | False |
-NotePropertyMembers
指定注释属性名称和值的哈希表或有序字典。 键入一个哈希表或字典,其中键是注释属性名称,值是 note 属性值。
有关 PowerShell 中的哈希表和有序字典的详细信息,请参阅 about_Hash_Tables。
此参数是在 Windows PowerShell 3.0 中引入的。
类型: | IDictionary |
Position: | 0 |
默认值: | None |
必需: | True |
接受管道输入: | False |
接受通配符: | False |
-NotePropertyName
指定 note 属性名称。
将此参数与 NotePropertyValue 参数配合使用。 此参数是可选的。
此参数是在 Windows PowerShell 3.0 中引入的。
类型: | String |
Position: | 0 |
默认值: | None |
必需: | True |
接受管道输入: | False |
接受通配符: | False |
-NotePropertyValue
指定注释属性值。
将此参数与 NotePropertyName 参数一起使用。 此参数是可选的。
此参数是在 Windows PowerShell 3.0 中引入的。
类型: | Object |
Position: | 1 |
默认值: | None |
必需: | True |
接受管道输入: | False |
接受通配符: | False |
-PassThru
返回一个对象,该对象表示正在使用的项。 默认情况下,此 cmdlet 不生成任何输出。
对于大多数对象,Add-Member
将新成员添加到输入对象。
但是,当输入对象是字符串时,Add-Member
无法将成员添加到输入对象。
对于这些对象,请使用 PassThru 参数创建输出对象。
在 Windows PowerShell 2.0 中,Add-Member
仅向 PSObject 对象包装器(而不是对象)添加了成员。
使用 PassThru 参数为具有 PSObject 包装器的任何对象创建输出对象。
类型: | SwitchParameter |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-SecondValue
指定有关 AliasProperty、ScriptProperty、CodeProperty或 CodeMethod 成员的可选附加信息。
如果在添加 AliasProperty时使用,则此参数必须是数据类型。 将转换为指定的数据类型添加到 AliasProperty的值。
例如,如果添加为字符串属性提供备用名称的
添加 ScriptProperty 成员时,可以使用 SecondValue 参数指定额外的 ScriptBlock。 Value 参数中指定的第一个 scriptBlock用于获取变量的值。 SecondValue 参数中指定的第二个 scriptBlock用于设置变量的值。
类型: | Object |
Position: | 3 |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-TypeName
指定类型的名称。
当类型是 系统 命名空间中的类或具有类型加速器的类型时,可以输入类型的短名称。 否则,需要完整类型名称。 此参数仅在 InputObject 是 PSObject时才有效。
此参数是在 Windows PowerShell 3.0 中引入的。
类型: | String |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Value
指定已添加成员的初始值。 如果添加 AliasProperty、CodeProperty、ScriptProperty 或 CodeMethod 成员,则可以使用 SecondValue 参数提供可选的其他信息。
类型: | Object |
Position: | 2 |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
输入
可以通过管道将任何对象类型传递给此 cmdlet。
输出
None or System.Object
使用 PassThru 参数时,此 cmdlet 返回新扩展的对象。 否则,此 cmdlet 不会生成任何输出。
备注
只能将成员添加到 PSObject 对象。 若要确定对象是否为 PSObject 对象,请使用 -is
运算符。
例如,若要测试存储在 $obj
变量中的对象,请键入 $obj -is [PSObject]
。
MemberType、Name、Value和 SecondValue 参数的名称是可选的。 如果省略参数名称,则未命名的参数值必须按以下顺序显示:MemberType、Name、Value和 SecondValue。
如果包括参数名称,参数可以按任意顺序显示。
可以在定义新属性和方法值的脚本块中使用 $this
自动变量。
$this
变量是指要向其添加属性和方法的对象实例。 有关 $this
变量的详细信息,请参阅 about_Automatic_Variables。