關(guān)于powershell自定義對象 PSCustomObject

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
        (
            ...
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饵隙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沮脖,更是在濱河造成了極大的恐慌金矛,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勺届,死亡現(xiàn)場離奇詭異驶俊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)免姿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門饼酿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胚膊,你說我怎么就攤上這事故俐。” “怎么了紊婉?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵药版,是天一觀的道長。 經(jīng)常有香客問我喻犁,道長槽片,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任肢础,我火速辦了婚禮还栓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乔妈。我一直安慰自己蝙云,他們只是感情好氓皱,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布路召。 她就那樣靜靜地躺著,像睡著了一般波材。 火紅的嫁衣襯著肌膚如雪股淡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天廷区,我揣著相機(jī)與錄音唯灵,去河邊找鬼。 笑死隙轻,一個(gè)胖子當(dāng)著我的面吹牛埠帕,可吹牛的內(nèi)容都是我干的垢揩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼敛瓷,長吁一口氣:“原來是場噩夢啊……” “哼叁巨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起呐籽,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤锋勺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后狡蝶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庶橱,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年贪惹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苏章。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奏瞬,死狀恐怖布近,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丝格,我是刑警寧澤撑瞧,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站显蝌,受9級(jí)特大地震影響预伺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜曼尊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一酬诀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骆撇,春花似錦瞒御、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涌乳,卻和暖如春蜻懦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背夕晓。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工宛乃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓征炼,卻偏偏與公主長得像析既,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子谆奥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容