ค้นหาเว็บไซต์

ความสนุกวันศุกร์: ดูออบเจ็กต์ใน PowerShell GridList


สิ่งหนึ่งที่ทำให้ PowerShell เรียนรู้ได้ง่ายคือการค้นพบได้ ต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับวัตถุบางประเภทหรือไม่ ส่งไปที่ Get-Member หรือหากคุณต้องการดูค่าไปป์ไปที่ Select-Object

get-ciminstance win32_computersystem | select *

นั่นก็ไม่เลวร้ายนัก หรือคุณสามารถไพพ์ไปที่ Out-Gridview

Get-CimInstance win32_computersystem | Select * | out-gridview

อย่างไรก็ตาม สำหรับวัตถุชิ้นเดียวมันไม่ง่ายเลยที่จะเห็นทุกอย่าง

อย่างน้อยสำหรับฉันสิ่งที่จะง่ายกว่าคือใช้ Out-Gridview แต่ดูคุณสมบัติในรายการเหมือนที่ฉันสามารถทำได้ด้วย Select-Object ดังนั้นฉันจึงเขียนฟังก์ชันขั้นสูงเพื่อทำสิ่งนั้น ฟังก์ชันรับวัตถุที่เข้ามา สร้างแฮชเทเบิลตามคุณสมบัติของวัตถุ จากนั้นจึงแสดงแฮชเทเบิ้ลใน Out-Gridview

Function Out-GridList {
[cmdletbinding()]

Param(
[Parameter(Position=0,Mandatory,ValueFromPipeline)]
[object]$InputObject,
[string]$Title="Out-GridList",
[switch]$Passthru
)

Begin {
  #initialize data array
  $data=@()
}
Process {
#initialize a hashtable for properties
$propHash = @{}
#get property names from the first object in the array
$properties = $InputObject | Get-Member -MemberType Properties

$properties.name | foreach {
Write-Verbose "Adding $_"
  $propHash.add($_,$InputObject.$_)
  
} #foreach

  $data +=$propHash

} #Process

End {

#tweak hashtable output
$data.GetEnumerator().GetEnumerator() | 
select @{Name="Property";Expression={$_.name}},Value |
Out-GridView -Title $Title -PassThru:$Passthru
}

} #end Out-Gridlist

ฟังก์ชันจะยอมรับหลายออบเจ็กต์ ซึ่งเป็นเหตุผลว่าทำไมฉันถึงมีอาร์เรย์ข้อมูลเพื่อจัดการหลายไปป์ในออบเจ็กต์ แต่มันทำงานได้ดีที่สุดกับวัตถุชิ้นเดียว ใน Process scriptblock ฉันส่งวัตถุไปที่ Get-Member เพื่อดึงคุณสมบัติ จากนั้นฟังก์ชันจะสร้างแฮชเทเบิลโดยที่คีย์คือแต่ละคุณสมบัติ และค่าคือค่าที่สอดคล้องกันจากออบเจ็กต์

ณ จุดนี้ ฉันสามารถเขียน hashtable ไปยัง Out-Gridview ได้อย่างง่ายดาย แต่ส่วนหัวของคอลัมน์จะระบุชื่อและค่า มันเป็นรายละเอียดเล็กๆ น้อยๆ แต่ฉันใช้แฮชเทเบิลกับ Select-Object เพื่อเปลี่ยนชื่อ "ชื่อ" เป็น "คุณสมบัติ" ยังไงก็ตามคุณอาจสังเกตเห็นบรรทัดนี้


$data.GetEnumerator().GetEnumerator() 

นั่นไม่ใช่การพิมพ์ผิด หากฉันไพพ์หลายอ็อบเจ็กต์ $data จะเป็นอาร์เรย์ของแฮชเทเบิล ดังนั้นฉันจึงต้องได้รับตัวแจงนับสำหรับแต่ละรายการ แต่ด้วยฟังก์ชันนี้ ตอนนี้ฉันได้จอแสดงผลที่ต้องการแล้ว

get-ciminstance win32_computersystem | select * | out-gridlist -title "Win32_Computersystem"

จริงๆ แล้วไม่มีการกรองใดๆ ให้ทำ แต่คุณสามารถคลิกที่ส่วนหัวของคอลัมน์เพื่อจัดเรียงได้ หรือคุณสามารถรัน Out-Gridlist ด้วย -passthru เพื่อให้คุณสามารถเลือกคุณสมบัติและส่งผ่านไปยังไปป์ไลน์ได้

ฉันหวังว่าคุณจะพบว่าสิ่งนี้มีประโยชน์ เพลิดเพลินอย่างมีความรับผิดชอบ

บทความที่เกี่ยวข้อง