当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] Add-Member (Microsoft.PowerShell.Utility)

作者:精品下载站 日期:2024-12-14 02:08:49 浏览:15 分类:玩电脑

Add-Member (Microsoft.PowerShell.Utility)


Add-Member

模块 :Microsoft.PowerShell.Utility

将自定义属性和方法添加到 PowerShell 对象的实例。

句法

Add-Member
   -InputObject <PSObject>
   -TypeName <String>
   [-PassThru]
   [<CommonParameters>]
Add-Member
   -InputObject <PSObject>
   [-TypeName <String>]
   [-Force]
   [-PassThru]
   [-NotePropertyMembers] <IDictionary>
   [<CommonParameters>]
Add-Member
   -InputObject <PSObject>
   [-TypeName <String>]
   [-Force]
   [-PassThru]
   [-NotePropertyName] <String>
   [-NotePropertyValue] <Object>
   [<CommonParameters>]
Add-Member
   -InputObject <PSObject>
   [-MemberType] <PSMemberTypes>
   [-Name] <String>
   [[-Value] <Object>]
   [[-SecondValue] <Object>]
   [-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 具有新功能,可以更轻松地向对象添加注释属性。您可以使用 NotePropertyNameNotePropertyValue 参数来定义注释属性,或使用 NotePropertyMembers 参数,该参数采用注释属性名称的哈希表和价值观。

此外,从 Windows PowerShell 3.0 开始,生成输出对象的 PassThru 参数的使用频率也降低了。 Add-Member 现在将新成员直接添加到更多类型的输入对象中。有关详细信息,请参阅 PassThru 参数说明。

示例

示例 1:向 PSObject 添加注释属性

以下示例将值为“Done”的 Status 注释属性添加到表示 Test.txt 文件的 FileInfo 对象。

第一个命令使用 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 note 属性

此示例将 StringUse 注释属性添加到字符串。由于 Add-Member 无法向 String 输入对象添加类型,因此您可以指定 PassThru 参数来生成输出对象。示例中的最后一个命令显示新属性。

此示例使用 NotePropertyMembers 参数。 NotePropertyMembers 参数的值是一个哈希表。键是注释属性名称 StringUse,值是注释属性值 Display

$A = "A string"
$A = $A | Add-Member -NotePropertyMembers @{StringUse="Display"} -PassThru
$A.StringUse

Display

示例 4:向 FileInfo 对象添加脚本方法

此示例将 SizeInMB 脚本方法添加到 FileInfo 对象,该对象计算文件大小(精确到兆字节)。第二个命令创建一个 ScriptBlock,它使用 [math] 类型中的 Round 静态方法将文件大小舍入到小数点后第二位。

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:创建自定义对象

此示例创建一个 Asset 自定义对象。

New-Object cmdlet 创建一个保存在 $Asset 变量中的 PSObject[ordered] 类型加速器创建一个存储在 $d 变量中的有序字典。通过管道将 $Asset 传送到 Add-Member 将字典中的键值对作为 NoteProperty 成员添加到对象中。 TypeName 参数将类型Asset 分配给PSObjectGet-Member cmdlet 显示对象的类型和属性。但是,属性按字母顺序列出,而不是按添加顺序。

$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 -MemberType Properties

TypeName: Asset

Name        MemberType   Definition
----        ----------   ----------
Name        NoteProperty string Name=Server30
PSVersion   NoteProperty string PSVersion=4.0
System      NoteProperty string System=Server Core

$Asset.PSObject.Properties | Format-Table Name, MemberType, TypeNameOfValue, Value

Name        MemberType TypeNameOfValue Value
----        ---------- --------------- -----
Name      NoteProperty System.String   Server30
System    NoteProperty System.String   Server Core
PSVersion NoteProperty System.String   4.0

检查属性的原始列表会按照属性添加到对象的顺序显示属性。本示例中使用 Format-Table 创建类似于 Get-Member 的输出。

示例 6:向对象添加 AliasProperty

在此示例中,我们创建一个包含两个 NoteProperty 成员的自定义对象。 NoteProperty 的类型反映了存储在属性中的值的类型。在本例中,Age 属性是一个字符串。

PS> $obj = [pscustomobject]@{
      Name = 'Doris'
      Age = '20'
}
PS> $obj | Add-Member -MemberType AliasProperty -Name 'intAge' -Value age -SecondValue uint32
PS> $obj | Get-Member

   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType    Definition
----        ----------    ----------
intAge      AliasProperty intAge = (System.UInt32)age
Equals      Method        bool Equals(System.Object obj)
GetHashCode Method        int GetHashCode()
GetType     Method        type GetType()
ToString    Method        string ToString()
Age         NoteProperty  string Age=20
Name        NoteProperty  string Name=Doris

PS> $obj

Name  Age intAge
----  --- ------
Doris 20      20

PS> $obj.Age + 1

201

PS> $obj.intAge + 1

21

intAge 属性是 Age 属性的 AliasProperty,但类型保证为 uint32

示例 7:向自定义对象添加 get 和 set 方法

此示例演示如何定义访问深度嵌套属性的 GetSet 方法。

$user = [pscustomobject]@{
    Name      = 'User1'
    Age       = 29
    StartDate = [datetime]'2019-05-05'
    Position  = [pscustomobject]@{
        DepartmentName = 'IT'
        Role = 'Manager'
    }
}
$addMemberSplat = @{
    MemberType = 'ScriptProperty'
    Name = 'Title'
    Value = { $this.Position.Role }                  # getter
    SecondValue = { $this.Position.Role = $args[0] } # setter
}
$user | Add-Member @addMemberSplat
$user | Get-Member

TypeName: System.Management.Automation.PSCustomObject

Name        MemberType     Definition
----        ----------     ----------
Equals      Method         bool Equals(System.Object obj)
GetHashCode Method         int GetHashCode()
GetType     Method         type GetType()
ToString    Method         string ToString()
Age         NoteProperty   int Age=29
Name        NoteProperty   string Name=User1
Position    NoteProperty   System.Management.Automation.PSCustomObject Position=@{DepartmentName=IT; Role=Manager}
StartDate   NoteProperty   datetime StartDate=5/5/2019 12:00:00 AM
Title       ScriptProperty System.Object Title {get= $this.Position.Role ;set= $this.Position.Role = $args[0] ;}

$user.Title = 'Dev Manager'

Name      : User1
Age       : 29
StartDate : 5/5/2019 12:00:00 AM
Position  : @{DepartmentName=IT; Role=Dev Manager}
Title     : Dev Manager

请注意,Title 属性是一个 ScriptProperty,它具有 GetSet 方法。当我们为 Title 属性分配新值时,将调用 Set 方法并更改 中的 Role 属性值。位置属性。

参数

-Force

默认情况下,如果对象已有相同的成员,则 Add-Member 无法添加新成员。当您使用 Force 参数时,Add-Member 会将现有成员替换为新成员。您不能使用Force参数来替换类型的标准成员。

类型 :

SwitchParameter

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-InputObject

指定要添加新成员的对象。输入包含对象的变量,或键入获取对象的命令或表达式。

类型 :

PS对象

位置:

命名

默认值:

None

必需的:

True

接受管道输入:

True

接受通配符:

False

-MemberType

指定要添加的成员的类型。此参数是必需的。该参数可接受的值为:

  • AliasProperty
  • CodeMethod
  • CodeProperty
  • NoteProperty
  • ScriptMethod
  • ScriptProperty

有关这些值的信息,请参阅 PowerShell SDK 中的 PSMemberTypes 枚举。

并非所有对象都具有每种类型的成员。如果指定对象没有的成员类型,PowerShell 将返回错误。

类型 :

PS 成员类型

别名:

Type

接受的值:

AliasProperty、CodeMethod、CodeProperty、NoteProperty、ScriptMethod、ScriptProperty

位置:

0

默认值:

None

必需的:

True

接受管道输入:

False

接受通配符:

False

-Name

指定此 cmdlet 添加的成员的名称。

类型 :

String

位置:

1

默认值:

None

必需的:

True

接受管道输入:

False

接受通配符:

False

-NotePropertyMembers

指定一个哈希表或有序字典,其中包含表示 NoteProperty 名称及其值的键值对。有关 PowerShell 中哈希表和有序字典的更多信息,请参阅 about_Hash_Tables。

此参数是在 Windows PowerShell 3.0 中引入的。

类型 :

词典

位置:

0

默认值:

None

必需的:

True

接受管道输入:

False

接受通配符:

False

-NotePropertyName

指定注释属性名称。

将此参数与 NotePropertyValue 参数结合使用。该参数是可选的。

此参数是在 Windows PowerShell 3.0 中引入的。

类型 :

String

位置:

0

默认值:

None

必需的:

True

接受管道输入:

False

接受通配符:

False

-NotePropertyValue

指定注释属性值。

将此参数与 NotePropertyName 参数结合使用。该参数是可选的。

此参数是在 Windows PowerShell 3.0 中引入的。

类型 :

目的

位置:

1

默认值:

None

必需的:

True

接受管道输入:

False

接受通配符:

False

-PassThru

返回一个代表您正在使用的项目的对象。默认情况下,此 cmdlet 不会生成任何输出。

对于大多数对象,Add-Member 将新成员添加到输入对象中。但是,当输入对象是字符串时,Add-Member 无法将成员添加到输入对象。对于这些对象,请使用 PassThru 参数创建输出对象。

在 Windows PowerShell 2.0 中,Add-Member 仅将成员添加到对象的 PSObject 包装器,而不是对象。使用 PassThru 参数为任何具有 PSObject 包装器的对象创建输出对象。

类型 :

SwitchParameter

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-SecondValue

指定有关 AliasPropertyScriptPropertyCodeProperty 成员的可选附加信息。

如果在添加 AliasProperty 时使用,则此参数必须是数据类型。到指定数据类型的转换将添加到 AliasProperty 的值中。例如,如果您添加为字符串属性提供备用名称的 AliasProperty,您还可以指定 System.Int32SecondValue 参数指示当使用相应的 AliasProperty 访问时,该字符串属性的值应转换为整数。

对于CodeProperty,该值必须是对实现Set访问器的方法的引用。使用类型引用的 GetMethod() 方法来获取对方法的引用。该方法必须采用一个参数,即 PSObject。使用Value参数分配Get访问器。

对于 ScriptProperty,该值必须是实现 Set 访问器的脚本块。使用Value参数分配Get访问器。

类型 :

目的

位置:

3

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-TypeName

指定类型的名称。

当类型是 System 命名空间中的类或具有类型加速器的类型时,您可以输入类型的短名称。否则,需要完整的类型名称。仅当InputObjectPSObject时,此参数才有效。

此参数是在 Windows PowerShell 3.0 中引入的。

类型 :

String

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-Value

指定添加成员的初始值。如果添加 AliasPropertyCodePropertyScriptProperty 成员,则可以使用 SecondValue 参数提供其他信息。

  • 对于AliasProperty,该值必须是被别名的属性的名称。
  • 对于CodeMethod,该值必须是对方法的引用。使用类型引用的 GetMethod() 方法来获取对方法的引用。
  • 对于CodeProperty,该值必须是对实现Get访问器的方法的引用。使用类型引用的 GetMethod() 方法来获取对方法的引用。参考。该方法必须采用一个参数,即 PSObjectSet 访问器是使用 SecondValue 参数分配的。
  • 对于 ScriptMethod,该值必须是脚本块。
  • 对于 ScriptProperty,该值必须是实现 Get 访问器的脚本块。 Set 访问器是使用 SecondValue 参数分配的。
类型 :

目的

位置:

2

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

输入

PSObject

您可以通过管道将任何对象传递给此 cmdlet。

输出

默认情况下,此 cmdlet 不返回任何输出。

对象

当您使用 PassThru 参数时,此 cmdlet 将返回新扩展的对象。

笔记

您只能将成员添加到 PSObject 类型对象。要确定对象是否为 PSObject 对象,请使用 -is 运算符。例如,要测试存储在 $obj 变量中的对象,请输入 $obj -is [psobject]

PSObject 类型对象按照成员添加到对象的顺序维护其成员列表。

MemberTypeNameValueSecondValue 参数的名称是可选的。如果省略参数名称,则未命名参数值必须按以下顺序显示:MemberTypeNameValueSecondValue

如果包含参数名称,则参数可以按任何顺序出现。

您可以在定义新属性和方法的值的脚本块中使用 $this 自动变量。 $this 变量指的是要添加属性和方法的对象的实例。有关 $this 变量的更多信息,请参阅 about_Automatic_Variables。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯