iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0

昨天講完 「管道參數綁定」( Pipeline Parameter Binding )後,在實務上,如果遇到需要處理「由其他人建立的物件或資料」時,書中講述了一種方法,這就是自訂屬性(也稱為計算屬性)。


自訂屬性

說明

自訂屬性允許你即時創建新的屬性或修改現有的屬性。這在需要重命名屬性以匹配下一個指令的預期輸入時特別有用。

語法

計算屬性是一個具有以下鍵的雜湊表(Hashtable)

  • Name:新屬性的名稱。
  • Expression:定義屬性值的腳本區塊。
@{
    Name = 'NewPropertyName';
    Expression = { $_.ExistingProperty }
}

範例 1

情境

假設你有一個檔案的物件集合,並且你希望能顯示檔案名及大小。

1. 原本未透過自訂屬性前

Get-ChildItem -File | Select-Object Name, Length | gm

https://ithelp.ithome.com.tw/upload/images/20240925/20168708kF7dtlqDqX.png

自訂一個屬性( size )來顯示檔案大小。

# 取得目前資料夾中的檔案,並新增一個顯示檔案大小的自訂屬性
Get-ChildItem -File | Select-Object Name, @{ Name = 'Size'; Expression = { $_.Length }} | gm

  • Name:顯示檔案名稱。
  • Size:顯示檔案大小。
    https://ithelp.ithome.com.tw/upload/images/20240925/20168708ItCoJMoABJ.png

範例 2

情境

假設你需要顯示檔案的建立時間,但希望用自訂的格式(例如:YYYY-MM-DD HH:MM)。

1. 原先建立時間的格式

Get-ChildItem -File | Select-Object Name, CreationTime

https://ithelp.ithome.com.tw/upload/images/20240925/20168708v3OgIhLCt5.png

2. 取得目前資料夾中的檔案,並新增一個以自訂格式顯示建立時間的屬性

Get-ChildItem -File | Select-Object Name, @{ Name = 'CreationDate'; Expression = { $_.CreationTime.ToString('yyyy-MM-dd HH:mm') } }

https://ithelp.ithome.com.tw/upload/images/20240925/20168708P5MMMZvekD.png


小括號中的命令

小括號的作用

在 PowerShell 中,小括號 () 用於執行括號內的命令或表達式,並將結果作為一個整體返回。

  • 控制執行順序:強制括號內的命令先執行。
  • 將結果作為單一物件或集合:括號內的結果可以作為一個整體進行後續操作。

範例 :嵌套命令

取得系統日期,然後格式化

1. 取得系統日期

PS /Users/kanglin/code/30days> Get-Date

2024年9月25日 星期三 1:07:03

2. 將結果用 ToString 方法格式化

PS /Users/kanglin/code/30days> (Get-Date).ToString('yyyy-MM-dd')
2024-09-25

使用小括弧與不使用小括弧的差異範例:計算特定檔案的總大小

不使用小括號

# 計算所有 .txt 檔案的總大小
Get-ChildItem -File | Where-Object { $_.Name -like '*.txt' } | Measure-Object -Property Length -Sum

https://ithelp.ithome.com.tw/upload/images/20240925/201687086H24PoME4Y.png

使用小括弧

# 取得所有 .txt 檔案的集合,然後取 Length 屬性的總和
($files = Get-ChildItem -File | Where-Object { $_.Name -like '*.txt' }).Length | Measure-Object -Sum

https://ithelp.ithome.com.tw/upload/images/20240925/20168708mRXuIFaW3k.png

差異解釋:

不使用小括號時,我們將物件管道傳遞給 Measure-Object,它能夠處理物件集合,並計算指定屬性的統計值。
使用小括號時,小括號內的命令先執行,結果是一個物件陣列。我們直接存取這個陣列的 Length 屬性,這會返回所有檔案大小的數值集合,然後再將這個數值集合傳遞給 Measure-Object。

另一個差異範例:存取物件的屬性

情境

取得檔案名稱的清單

不使用小括號

我們需要使用 Select-Object -ExpandProperty 來提取名稱屬性。

# 取得所有 .txt 檔案的名稱
Get-ChildItem -File | Where-Object { $_.Name -like '*.txt' } | Select-Object -ExpandProperty Name

https://ithelp.ithome.com.tw/upload/images/20240925/20168708ubPxuQnX0L.png

使用小括號

我們先取得物件的集合,然後直接存取 Name 屬性,這會返回一個名稱的陣列。

# 使用小括號,然後直接存取 Name 屬性
($files = Get-ChildItem -File | Where-Object { $_.Name -like '*.txt' }).Name

https://ithelp.ithome.com.tw/upload/images/20240925/20168708qe5m1uT0ez.png


提取單一屬性的值

為什麼要提取單一屬性?

在處理物件集合時,可能只需要某一個特定屬性的值,例如名稱、大小、日期等。提取單一屬性可以簡化資料,方便進一步的處理或計算。

方法 1:Select-Object 與 -ExpandProperty

-ExpandProperty 直接返回屬性的值,而非包含在物件內。
直接取得屬性值,適合提取單一屬性
https://ithelp.ithome.com.tw/upload/images/20240925/20168708jCZ5gdzHNF.png

方法 2:管道與 ForEach-Object

使用 ForEach-Object 遍歷每個物件,提取所需的屬性。
適合需要對每個物件進行處理時使用。
https://ithelp.ithome.com.tw/upload/images/20240925/20168708ufHzMpNvuu.png

方法 3:直接存取屬性

對於單一物件或已知名稱的屬性,可以直接存取。
當物件結構簡單或已知時,可以直接使用 物件.屬性 的方式。

# 取得當前使用者的環境變數路徑
$envPath = $env:PATH
Write-Output $envPath

明日主題

Day 12 - 使你所見更加美觀:格式化


上一篇
Day 10 - 深度探索管線
下一篇
Day 12 - 使你所見更加美觀:格式化
系列文
《30天挑戰精通 PowerShell:從 Windows Server 到 Azure DevOps 自動化之旅》30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言