Windows PowerShell:多種自訂物件的方法

真的沒關係,只要是你的最終結果的自訂物件為輸出的自訂物件,選擇哪一種方法。

Don Jones

最近,我寫了一篇博文,列出了一套 12 最佳使用 Windows PowerShell。 在 No. 12最佳實踐指導鄉親輸出從他們的腳本和函數,而輸出的文本物件。 我甚至建議是否您曾經使用寫入主機 cmdlet,你應該退一步,想想你在做什麼。 所有寫入主機不都會是產生文本。

該職位不長的時間去活後,一位讀者與我聯絡有關我已用於實際創建的自訂物件的代碼。 他說他從未見過這種方法之前。 那是不令人意外的是,Windows PowerShell 似乎提供了十幾個方式做任何事情。 他建議我寫一篇文章來生成自訂物件的不同方式,所以我們在這裡。

完整的方式

這是大多數人可能會選擇來創建自訂物件的方法。 這就是所謂的"教科書的方法"。它的優點是很明顯的是,儘管它涉及到大量的輸入。 假設有一個物件變數 $ 作業系統,和 $bios 中的另一種,可以合併從他們的資訊,像這樣的選的件:

$object = New-Object –TypeNamePSObject $object | Add-Member –MemberTypeNoteProperty –Name OSBuild –Value $os.BuildNumber $object | Add-Member –MemberTypeNoteProperty –Name OSVersion –Value $os.Version $object | Add-Member –MemberTypeNoteProperty –Name BIOSSerial –Value $bios.SerialNumber Write-Output $object

您可以繼續這種模式最終輸出物件,之前向其寫入管道添加您需要的任何其他資訊。

-通過:一個簡短的快捷方式

您可以通過告訴添加成員的物件放回到管道進行,第一種方法更簡明:

$object = New-Object –TypeNamePSObject $object | Add-Member –MemberTypeNoteProperty –Name OSBuild –Value $os.BuildNumber –PassThru | Add-Member –MemberTypeNoteProperty –Name OSVersion –Value $os.Version –PassThru | Add-Member –MemberTypeNoteProperty –Name BIOSSerial –Value $bios.SerialNumber Write-Output $object

當你結束與管道字元的行時,Windows PowerShell 知道要去尋找下一個命令的管道下物理一行。 本質上,它是分手到多個物理線路長命令的方法。 那套把戲,結合 –PassThru 交換機,使這一系列的三個不同的命令。

雜湊表日趨

雖然以前的方法是有效的他們也很囉嗦。 在腳本中,它實際上可以硬要直觀地確定發生了什麼。 使用新物件功能是一種更簡潔的方法。 這允許您創建雜湊表 (或關聯陣列),它包含的屬性名稱和您要添加到新創建的物件的值。 每個作為 NoteProperty 自動創建這些屬性:

$properties = @{'OSBuild'=$os.BuildNumber; 'OSVersion'=$os.version; 'BIOSSerial'=$bios.SerialNumber} $object = New-Object –TypeNamePSObject –Prop $properties Write-Output $object

這具有相同的效果,但簡明得多。 有些聰明的人將使用括弧的運算式,以使它甚至更短。 不過,我覺得這很有點更難閱讀:

$object = New-Object –TypeNamePSObject –Prop (@{'OSBuild'=$os.BuildNumber; 'OSVersion'=$os.version; 'BIOSSerial'=$bios.SerialNumber}) Write-Output $object

有點更進一步

你會發現在這些示例中,我自訂物件保存到變數 ($物件) 寫入管道之前。 其後的原因很簡單。 您可能需要處理更多的物件。 例如,您可能要給您的物件的自訂類型的名稱:

$object.PSObject.TypeNames.Insert(0,'My.Custom.Name')

這樣做可以創建自訂的預設格式顯示您的物件的佈局。 我用這招很大的作用,在"Windows PowerShell 腳本和模具製造廠家"(集中技術和介面技術培訓,2011年),我寫了這本小書側重于諸如 Windows PowerShell 定制工具的輸出使用自訂的物件。

不同人有不同愛好的描邊

沒有在 Windows PowerShell,任何事情的方式"錯誤",只要你的方法獲取完成工作。 話雖如此,有的避免,某些方法,主要是因為他們不讀和難教 — — 尤其是對新來者。 這是一個,仍然假設我 $os 和 $bios 變數包含原始物件我要提取的資訊:

$os | Select-Object –Property @{n='OSVersion';e={$_.Version}}, @{n='OSBuild';e={$_.BuildNumber}}, @{n='BIOSSerial';e={$bios.SerialNumber}}

你會生成相同的結果與前面的示例,但語法是令人震驚。 有很多的標點,大量的結構,和你要瞭解很多有關選擇物件用這些三哈做什麼。

它基本上生成使用語法獨特,該 cmdlet (和共用的格式 cmdlet) 的自訂屬性。 您將看到該軟體發展風格背景的人所使用的語法。 這是我 (和許多其他人) 精神分析,更難的所以我傾向于不一樣使用它。

PowerShell 是什麼如果不靈活

Windows PowerShell 是唯一的因為它可以讓你走一些瘋狂的事情。 例如,回到我雜湊表的示例。 您還可以執行它通過這種方式:

$info = @{} $info.OSBuild=$os.BuildNumber $info.OSVersion=$os.version $info.BIOSSerial=$bios.SerialNumber $object = New-Object –TypeNamePSObject –Prop $info Write-Output $object

您正在創建空的雜湊表,然後通過引用不存在的屬性中添加資訊。 當您第一次嘗試訪問 OSBuild 時,例如,Windows PowerShell 實現無財產的存在是 $資訊物件 (它是空的雜湊表) 中。 它隱式創建屬性,並將您的值分配。 瘋狂的東西 — — 但它的工作原理。

道德的立場:物件,沒有文本

不管您選擇創建您自訂的物件,您可以創建自訂的物件,而不是輸出到主控台視窗的只是文本。 物件是無限更靈活,和他們讓你結合一切其他 Windows PowerShell 的腳本或函數的輸出。

Don Jones

Don Jones是 Microsoft MVP 獎得主和"學習 Windows PowerShell 中月的午餐 」 (曼甯出版物,2011年),旨在説明成為有效的 Windows PowerShell 任何管理員一本書的作者。 鐘斯還提供公共和現場 Windows PowerShell 培訓。 通過他的網站 ConcentratedTech.com,可以與他聯繫。

相關的內容