Add-Member
為 Windows PowerShell 物件的執行個體加入使用者定義的自訂成員。
語法
Add-Member [-MemberType] {<AliasProperty> | <CodeProperty> | <Property> | <NoteProperty> | <ScriptProperty> | <Properties> | <PropertySet> | <Method> | <CodeMethod> | <ScriptMethod> | <Methods> | <ParameterizedProperty> | <MemberSet> | <Event> | <All>} [-Name] <string> -InputObject <psobject> [[-Value] <Object>] [[-SecondValue] <Object>] [-Force] [-PassThru] [<CommonParameters>]
描述
Add-Member Cmdlet 會為 Windows PowerShell 物件的執行個體新增使用者定義的自訂成員。它可讓您加入下列成員類型:AliasProperty、CodeProperty、NoteProperty、ScriptProperty、PropertySet、CodeMethod、MemberSet 和 ScriptMethod。您可以使用 Value 參數來設定成員的初始值。如果是 AliasProperty、ScriptProperty、CodeProperty 和 CodeMethod,則可以使用 SecondValue 參數來提供其他資訊。
其他的成員會加入至您經由管道輸出至 Add-Member 或是使用 InputObject 參數所指定的特定物件執行個體中。其他的成員只有在該執行個體存在時才能使用。您可以使用 Export-Clixml Cmdlet,將執行個體 (包括其他成員) 儲存至檔案。Import-Clixml Cmdlet 則可以使用該檔案中儲存的資訊來重新建立物件執行個體。
參數
-Force
即使已有名稱相同的成員,亦強制加入新成員。不適用於類型的核心成員。
必要? |
false |
位置? |
named |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
-InputObject <psobject>
指定要加入新成員的物件。請輸入包含物件的變數,或輸入可取得物件的命令或運算式。
必要? |
true |
位置? |
named |
預設值 |
|
接受管線輸入? |
true (ByValue) |
接受萬用字元? |
false |
-MemberType <PSMemberTypes>
指定要新增的成員型別。此參數是必要的。
此參數的有效值為:
-- AliasProperty:為現有屬性定義新名稱的屬性。
-- CodeMethod:參考 Microsoft .NET Framework 類別之靜態方法的某個方法。
-- CodeProperty:參考 .NET Framework 類別之靜態屬性的某個屬性。
-- MemberSet:屬性及方法的預先定義的集合,例如 PSBase、PSObject 和 PSTypeNames。
-- Method:基礎 .NET Framework 物件的方法。
-- NoteProperty:有靜態值的屬性。
-- ParameterizedProperty:接受參數和參數值的屬性。
-- Property:基礎 .NET Framework 物件的屬性。
-- PropertySet:物件屬性的預先定義的集合。
-- ScriptMethod:值為指令碼輸出的方法。
-- ScriptProperty:值為指令碼輸出的屬性。
-- All:取得所有成員型別。
-- Methods:取得物件方法的所有型別 (例如 method、codemethod、scriptmethod)
-- Properties:取得物件屬性的所有型別 (例如 property、codeproperty、aliasproperty、scriptproperty)。
並不是所有物件都有全部的成員型別。如果指定物件所沒有的成員型別,Windows PowerShell 就會傳回錯誤。
Event 成員型別不適用於 Add-Member。
必要? |
true |
位置? |
1 |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
true |
-Name <string>
指定所加入成員的名稱。
如果省略 "Name" 參數名稱,-Name 參數的值就必須是命令中第二個未具名的參數值。如果包含參數名稱,則可依任意順序列出參數。
必要? |
true |
位置? |
2 |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
-PassThru
將新擴充的物件傳遞給管線。根據預設,此 Cmdlet 不會產生任何輸出。
必要? |
false |
位置? |
named |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
-SecondValue <Object>
指定有關 AliasProperty、ScriptProperty、CodeProperty 或 CodeMethod 成員的其他選擇性資訊。若在加入 AliasProperty 時使用,則此參數必須是資料類型。AliasProperty 的值會經過轉換成為指定的資料類型。例如,若您加入 AliasProperty 以提供字串屬性的替代名稱,便可將 SecondValue 參數指定為 System.Int32,表示每當使用對應的 AliasProperty 存取該字串屬性時,都應該將其值轉換成整數。
加入 ScriptProperty 成員時可以使用 SecondValue 參數額外指定 ScriptBlock。在此情況下,便會使用 Value 參數內指定的第一個 ScriptBlock 來取得變數的值。SecondValue 參數內指定的第二個 ScriptBlock 會用來設定變數的值。
必要? |
false |
位置? |
4 |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
-Value <Object>
指定所加入成員的初始值。如果加入的是 AliasProperty、CodeProperty 或 CodeMethod 成員,則可使用 SecondValue 參數提供其他選擇性資訊。
必要? |
false |
位置? |
3 |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
<CommonParameters>
這個 Cmdlet 支援一般參數:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer 和 -OutVariable。如需詳細資訊,請參閱 about_Commonparameters.
輸入和輸出
輸入型別是可經由管道輸出至 Cmdlet 的物件型別。傳回型別則是 Cmdlet 所傳回的物件型別。
輸入 |
System.Management.Automation.PSObject 您可經由管道將任何物件類型輸出至 Add-Member。 |
輸出 |
無或 System.Object 當您使用 PassThru 參數時,Add-Member 會傳回新擴充的物件。否則,這個 Cmdlet 不會產生任何輸出。 |
附註
您只能將成員加入至 PSObject 物件。若要判斷物件是否為 PSObject 物件,請使用 "is" 運算子。例如,若要測試 $obj 變數中儲存的物件,可以輸入 "$obj -is [PSObject]"。
MemberType、Name、Value 及 SecondValue 參數的名稱為選擇性。如果省略參數名稱,就必須依此順序列出未具名的參數值:MemberType、Name、Value、SecondValue。如果包含參數名稱,則可依任意順序列出參數。
範例 1
C:\PS>$a = (get-childitem)[0]
C:\PS> $a | add-member -membertype noteproperty -name Status -value done
C:\PS> $a | get-member -type noteproperty
TypeName: System.IO.DirectoryInfo
Name MemberType Definition
---- ---------- ----------
PSChildName NoteProperty System.String PSChildName=Co
PSDrive NoteProperty System.Management.Automation
PSIsContainer NoteProperty System.Boolean PSIsContainer
PSParentPath NoteProperty System.String PSParentPath=M
PSPath NoteProperty System.String PSPath=Microso
PSProvider NoteProperty System.Management.Automation
Status NoteProperty System.String Status=done
描述
-----------
這些命令會將 Status note 屬性加入至 Get-ChildItem 所傳回的 DirectoryInfo 物件中,並為它指派 "done" 的值。
第一個命令會取得 Get-Childitem 所傳回的第一個物件 (索引 0)。
第二個命令會加入 note 屬性。
第三個命令會使用管線運算子 (|),將更新的物件傳送到 Get-Member Cmdlet。輸出會顯示已經加入此屬性。
範例 2
C:\PS>$a = (get-childitem)[0]
C:\PS> $a | add-member -membertype aliasproperty -name FileLength -value Length
C:\PS> $a.filelength
描述
-----------
這些命令會將 FileLength alias 屬性加入至 Get-ChildItem 所傳回的 DirectoryInfo 物件。新的屬性是 Length 屬性的別名。
第一個命令會取得 Get-Childitem 所傳回的第一個物件 (索引 0)。
第二個命令會加入 alias 屬性。
第三個命令會傳回新 FileLength 屬性的值。
範例 3
C:\PS>$a = "a string"
C:\PS> $a = $a | add-member -membertype noteproperty -name StringUse -value Display -passthru
C:\PS> $a.StringUse
描述
-----------
這些命令會將 StringUse 屬性加入至字串。因為此字串並非 PSObject 物件,所以您必須在命令中指定 PassThru 參數,才能將擴充的字串儲存到變數中。範例中的最後一個命令會顯示新的屬性。
範例 4
C:\PS>$a = "this is a string"
C:\PS> $a = add-member -inputobject $a -membertype scriptmethod -name words `
-value {$this.split()} -passthru
C:\PS> $a.words()
描述
-----------
這些命令會將指令碼方法加入至字串物件。這個指令碼方法公開 System.String .NET Framework 類別庫類別的 Split() 方法,可讓您很方便地藉由呼叫字串物件上名為 "Words" 的方法,傳回字串中的個別單字。請注意,指定 PassThru 參數是為了強制 Add-Member 將擴充的字串物件當做輸出傳回,以便儲存至 $a 變數中。
範例 5
C:\PS>$event = get-eventlog -logname system -newest 1
C:\PS> $event.TimeWritten | get-member
C:\PS> add-member -inputobject $event -membertype aliasproperty -name When `
-value TimeWritten -secondvalue System.String
C:\PS> $event.When | get-member
描述
-----------
這些命令會將 AliasProperty 加入至 Get-EventLog Cmdlet 所傳回的 EventLogEntry 物件。AliasProperty 的名稱為 "When",而且是物件之 TimeWritten 屬性的別名。SecondValue 參數是用來指定:當使用 AliasProperty 存取屬性值時,必須將它轉換為類型 System.String;TimeWritten 屬性為 DateTime 物件。
第一個命令會使用 Get-EventLog Cmdlet,從系統事件記錄檔擷取最新的事件,並將它儲存在 $event 變數中。
第二個命令會存取該事件的 TimeWritten 屬性,並經由管道將它輸入至 Get-Member Cmdlet,表明該屬性為 DateTime 類型。然後使用 Add-Member 將 AliasProperty 成員加入至儲存於 $event 變數的 EventLogEntry 物件執行個體。Name 參數用於將新成員的名稱設定為 "When",而 Value 參數則用於指定此成員是 TimeWritten 屬性的別名。SecondValue 參數用來表示:使用這個新成員時,應該將它傳回的值從原始的 System.DateTime 類型轉換為 System.String 類型。
第三個命令會存取新成員,並經由管道將它輸入至 Get-Member Cmdlet,以確認它屬於類型 System.String。
範例 6
C:\PS>function Copy-Property ($From, $To)
{
foreach ($p in Get-Member -InputObject $From -MemberType Property)
{
Add-Member -InputObject $To -MemberType NoteProperty -Name $p.Name
-Value $From.$($p.Name) -Force
$To.$($p.Name) = $From.$($p.Name)
}
}
描述
-----------
這個函數會將一個物件的所有屬性複製到另一個物件。
函數的第一個命令會宣告此函數名稱,並列出其參數。
Foreach 迴圈會使用 Get-Member Cmdlet 取得 From 物件的每個屬性。而 Foreach 迴圈內的命令會連續在每個屬性上執行。
Add-Member 命令會將 From 物件的屬性加入至 To 物件當做 NoteProperty。它會使用 Force 參數讓此命令加入同名的成員。
函數的最後一個命令是將新屬性命名為與原始屬性同名。