01.創(chuàng)建一個(gè)PSCustomObject
這是powershell中創(chuàng)建一個(gè)對象比較簡單的方法
$myObject = [PSCustomObject]@{
Name = 'Kevin'
Language = 'PowerShell'
State = 'Texas'
}
然后你就可以像對象一樣使用了劝贸,雖然哈希表本來也支持這樣操作
$myObject.Name
也可以轉(zhuǎn)化已經(jīng)存在的哈希表
$myHashtable = @{
Name = 'Kevin'
Language = 'PowerShell'
State = 'Texas'
}
$myObject = [pscustomobject]$myHashtable
過時(shí)的方法
在早期版本的powershell中可以這樣做螟炫,
主要是太麻煩了。
$myHashtable = @{
Name = 'Kevin'
Language = 'PowerShell'
State = 'Texas'
}
$myObject = New-Object -TypeName PSObject -Property $myHashtable
還有一種方法膀哲,就是把哈希表保存成json低千,然后在讀入轉(zhuǎn)化為對象
$myObject | ConvertTo-Json -depth 1 | Set-Content -Path $Path
$myObject = Get-Content -Path $Path | ConvertFrom-Json
02.屬性操作
001.添加屬性
$myObject | Add-Member -MemberType NoteProperty -Name 'ID' -Value 'KevinMarquette'
$myObject.ID
002.移除屬性
$myObject.psobject.properties.remove('ID')
003.遍歷屬性
$myObject | Get-Member -MemberType NoteProperty | Select -ExpandProperty Name
我們可以從 properties屬性中得到同樣的列表
$myobject.psobject.properties.name
004.動(dòng)態(tài)訪問屬性
$myObject.Name
也可以用字符串
$myObject.'Name'
還可以用變量醇疼,不過這個(gè)語法我還是覺得太別扭
$property = 'Name'
$myObject.$property
005.轉(zhuǎn)換PSCustomObject為哈希表
運(yùn)用上面獲得屬性列表的方法進(jìn)行遍歷陕习。
$hashtable = @{}
foreach( $property in $myobject.psobject.properties.name )
{
$hashtable[$property] = $myObject.$property
}
006.測試屬性存在
if( $null -ne $myObject.ID )
上面的方法有一個(gè)問題就是有可能值就是$null
if( $myobject.psobject.properties.match('ID').Count )
03.添加對象方法
我們可以用Add-Member,和哈希表打包參數(shù)的形式抗愁,添加函數(shù)方法
其中函數(shù)定義在腳本塊里馁蒂。
$ScriptBlock = {
$hashtable = @{}
foreach( $property in $this.psobject.properties.name )
{
$hashtable[$property] = $this.$property
}
return $hashtable
}
$memberParam = @{
MemberType = "ScriptMethod"
InputObject = $myobject
Name = "ToHashtable"
Value = $scriptBlock
}
Add-Member @memberParam
然后我們就可以調(diào)用了,總感覺就很麻煩呵晚,比起js直接就能寫函數(shù)來說。
$myObject.ToHashtable()
對象和值類型
$first = 1
$second = $first
$second = 2
$third = [PSCustomObject]@{Key=3}
$fourth = $third
$fourth.Key = 4
對象的copy方法
屬于是淺拷貝
$third = [PSCustomObject]@{Key=3}
$fourth = $third.psobject.copy()
$fourth.Key = 4
PSTypeName
常見的方式
$myObject.PSObject.TypeNames.Insert(0,"My.Object")
還有另一種方法
$myObject = [PSCustomObject]@{
PSTypeName = 'My.Object'
Name = 'Kevin'
Language = 'PowerShell'
State = 'Texas'
}
04. 默認(rèn)屬性集 DefaultPropertySet
powershell中有一個(gè)配置決定默認(rèn)顯示那些屬性沫屡。
$defaultDisplaySet = 'Name','Language'
$defaultDisplayPropertySet = New-Object System.Management.Automation.PSPropertySet('DefaultDisplayPropertySet',[string[]]$defaultDisplaySet)
$PSStandardMembers = [System.Management.Automation.PSMemberInfo[]]@($defaultDisplayPropertySet)
$MyObject | Add-Member MemberSet PSStandardMembers $PSStandardMembers
Update-TypeData
這個(gè)方法更容易使用
$TypeData = @{
TypeName = 'My.Object'
DefaultDisplayPropertySet = 'Name','Language'
}
Update-TypeData @TypeData
$myObject | Format-List *
ScriptProperty
$TypeData = @{
TypeName = 'My.Object'
MemberType = 'ScriptProperty'
MemberName = 'UpperCaseName'
Value = {$this.Name.toUpper()}
}
Update-TypeData @TypeData
05.作為函數(shù)參數(shù)
param( [PSTypeName('My.Object')]$Data )
作為函數(shù)輸出
function Get-MyObject
{
[OutputType('My.Object')]
[CmdletBinding()]
param
(
...