PowerShell Measure-Object:帶有示例的完整指南

計算或計算對象的數值屬性,如字符、單詞和字符串對象中的行數,可能會令人沮喪。幸運的是,PowerShell Measure-Object cmdlet能夠勝任這項任務。

在這個教程中,您將學習到如何利用Measure-Object cmdlet自動測量PowerShell中對象的屬性。

立即開始,提升您的對象測量技能!

先備條件

本教程是一個實踐演示。要跟隨操作,您需要一個已安裝PowerShell的系統。本教程使用的是安裝了PowerShell v7的Windows 10。

計算文件和文件夾

了解目錄中文件和文件夾的數量在各種情況下都可能有所幫助。一個例子是當您需要監視文件夾的大小或檢查目錄中的文件數量時。

Measure-Object cmdlet會計算目錄中文件和文件夾的數量。確切的計數有助於您更好地管理和優化系統資源。

要了解Measure-Object cmdlet如何計算文件和文件夾的數量:

1. 打開 PowerShell 並執行以下 Get-ChildItem 命令以計算並返回當前目錄中的總文件和文件夾數量(Measure-Object)。

Get-ChildItem | Measure-Object

以下輸出表示當前目錄中有 4852 個文件和文件夾。

Counting the files and folders in the current directory

也許您想要遞歸地包含目錄樹中的所有文件和子目錄。如果是這樣,請附加 -Recurse 參數,如下所示。 Get-ChildItem -Recurse | Measure-Object

2. 接下來,執行與步驟一中相同的命令。但這次,在命令的末尾添加 -Directory 參數,以僅計算工作目錄中的總目錄數量。

Get-ChildItem -Directory | Measure-Object

正如您在下面看到的,總數現在更低(135),因為該命令僅計算目錄,排除所有其他對象。

Counting the number of directories in the current directory

3. 現在,執行以下命令以計算當前目錄中的可執行文件(.exe)數量。

-Filter 參數告訴 Get-ChildItem 命令讓結果進行篩選,僅返回指定擴展名的文件(即,*.txt*.jpg*.csv)。

Get-ChildItem -Filter *.exe | Measure-Object
Counting the number of executable files in a directory

測量檔案大小

測量物件的長度和大小可以幫助更好地管理您的系統,因為大型檔案會影響系統的性能。除了計算屬性之外,您還可以使用 Measure-Object 命令來測量物件的長度和大小。

運行以下代碼以檢索當前目錄中的所有檔案( Get-ChildItem )並顯示( Write-Host )它們的默認字節長度。

以下代碼將每個測量輸出到控制台,包括最小和最大檔案大小、平均檔案大小、檔案大小總和和檔案總數。

# 設置平均檔案大小的閾值
$threshold = 5000000 
# 測量當前目錄中每個檔案的大小
$files = Get-ChildItem | Measure-Object -Property length -Minimum -Maximum -Sum -Average

Write-Host "Minimum file size: $($files.Minimum) bytes"
Write-Host "Maximum file size: $($files.Maximum) bytes"
Write-Host "Sum of file sizes: $($files.Sum) bytes"
Write-Host "Average file size: $($files.Average) bytes"
Write-Host "Total number of files: $($files.Count)"

# 檢查平均檔案大小是否超過或低於閾值
if ($files.Average -ge $threshold) {
    # 如果平均檔案大小超過閾值,播放高音
    [console]::beep(1000, 500)
} else {
    # 如果平均檔案大小低於閾值,播放低音
    [console]::beep(500, 500)
}

下面,您可以看到以字節為單位顯示的大小。

Measuring file sizes

也許將代碼粘貼到控制台並不是您的菜。如果是這樣,請將代碼保存到一個 PowerShell 腳本文件中並運行它。

現在,運行以下命令以獲取當前目錄中大小等於最大文件大小的文件,其中 (Where-Object) 文件的大小 ($_.Length) 等於最大文件大小 ($files.Maximum)。

# 獲取並存儲與 $files.Maximum 大小相同的文件
$max = Get-ChildItem | Where-Object -FilterScript {$_.Length -eq $files.Maximum}
# 顯示最大大小 ($files.Maximum) 的值和該大小的文件
Write-Host "Maximum file size: $($files.Maximum) bytes `nFile: $max"

以下輸出顯示了當前目錄中最大文件的名稱。

Getting the most extensive file in size

測量文本文件內容

如果您需要測量文本文件的行數、詞數或字符數,則可能需要使用 Measure-Object 命令,該命令有許多其他參數可用於測量文本文件內容。

運行下面的代碼來執行以下操作:使用-Character-Line-Word對文本文件的內容進行測量(Measure-Object),並輸出(Write-Host)測量結果。

請確保將$file_path$file_content變量的值更改為您自己的值。

# 定義文件路徑和內容
$file_path = "C:\Temp\measure-object.txt"
$file_content = "One fish, two fishes, three fishes"

# 根據定義的文件路徑和內容創建文件
Set-Content -Path $file_path -Value $file_content

# 測量文本文件的內容
$measurements = Get-Content -Path $file_path | Measure-Object -Character -Line -Word

# 將測量結果輸出到控制台
Write-Host "The file '$file_path' contains $($measurements.Lines) lines, $($measurements.Words) words, and $($measurements.Characters) characters."
Measuring text file contents

測量布林值

布林值是只能為true或false的值。在PowerShell中,布林值常用於控制腳本的流程、確定條件(true或false)或指示命令的成功或失敗。

測量布林值在各種情況下都很有用,例如:

  • 計算數據集中true或false值的數量。
  • 確定true值相對於總值的百分比。

這些信息有助於在處理或分析數據時做出明智的決策。

要查看如何測量布林值的工作原理:

執行以下命令來計算陣列($values)中布林值(默認為true值)的總和。

# 定義一個布林值陣列($true 和 $false)。
$values = $true,$false,$false,$true,$true,$true,$false,$false,$true
# 計算布林值的總和(默認為true值)。
$values | Measure-Object -Sum

以下,布林值的總數為九(9),而總和為五(5),因為僅計算了true值。

那麼false值呢?跳到下一步,執行更多命令。

Counting the number of true values in an array

現在,運行以下代碼,從布林值的總數($count)中減去true值的總和($trueCount)。方程式的差異就是false值的總數($falseCount)。

# 獲取陣列中布林值的總數
$count = $values.Count
# 獲取true值的總和
$trueCount = ($values | Measure-Object -Sum).Sum
# 從布林值的總數中減去true值的總和
# 得到false值的總數
$falseCount = $count - $trueCount
# 顯示true和false值的總計數
Write-Host "Number of true values: $trueCount"
Write-Host "Number of false values: $falseCount"
Counting the number of false values

如果測量布林值是一項日常任務,您可以創建一個可以隨時調用的函數來執行該任務。

測量哈希表

PowerShell 中的哈希表(一組鍵-值對的集合)允許您快速高效地存儲和檢索數據。如果您需要哈希表中的項目數量或最大值和最小值,可以使用 Measure-Object 命令來測量您的哈希表。

運行以下命令在您的哈希表($MyHastable)中查找 Num 屬性的 -Minimum-Maximum 值。

# 創建包含三個哈希表的哈希表,每個哈希表都有一個 Num 屬性。
$MyHashtable = @(@{Num=10}, @{Num=20}, @{Num=30})
# 通過最小值和最大值測量哈希表的 Num 屬性。
$Stats = $MyHashtable | Measure-Object -Minimum -Maximum Num
# 顯示哈希表的測量結果
$Stats
Measuring hashtables

測量標準差

檢閱資料集可能會變得冗長,但不一定要如此。當了解資料集數值的分佈時,測量標準差是很方便的。您也可以識別任何影響結果的離群值或不尋常的資料點。

標準差測量了數據集數值相對於平均值的變異或分散。此測量是通過計算數據的方差的平均值來計算的,而方差則是數據與平均值之間差的平方的平均值。

運行下面的代碼以計算並顯示存儲在$Numbers變量中的數組的-Average-StandardDeviation

# 定義一個數組
$Numbers = 10, 20, 30, 40, 50

# 計算數字的平均值和標準差
$Average = ($Numbers | Measure-Object -Average).Average
$StdDev = ($Numbers | Measure-Object -StandardDeviation).StandardDeviation

# 輸出結果
"Average: $Average"
"Standard deviation: $StdDev"

在統計學中,平均值衡量了中心趨勢,描述了資料集的典型或最具代表性的值。

平均值是通過將資料集中所有數字相加並除以總數來計算的。在這個例子中,數據集為{10, 20, 30, 40, 50},總和為150,集合中有五個數字(5)。

因此,以下是計算的平均值,即30

Average = (10 + 20 + 30 + 40 + 50) / 5 = 30

另一方面,標準差衡量了一組數據的分佈或散佈。標準差的計算如下:

1. Find the difference between each data point and the average:
   10 - 30 = -20
   20 - 30 = -10
   30 - 30 = 0
   40 - 30 = 10
   50 - 30 = 20
   
2. Square each of these differences:
   (-20)^2 = 400
   (-10)^2 = 100
   0^2 = 0
   10^2 = 100
   20^2 = 400
   
3. Add up all the squared differences:
   400 + 100 + 0 + 100 + 400 = 1000
   
4. Divide the sum of squared differences by the total number of values:
   1000 / 5 = 200
   
5. Take the square root of the result:
   sqrt(200) = 14.142135623731
   
The standard deviation of this set of data is approximately 14.14. But 
in this case, the result is 15.8113883008419 
because of floating-point arithmetic limitations in computers.
Measuring the standard deviation

結論

測量數據是一項重要任務,而 PowerShell 的 Measure-Object cmdlet 是完成該任務的強大工具。在這個教程中,您已經學會了如何以多種方式測量數據。無論您是在處理文件、文本文件內容、布林值、字符串、數組還是哈希表,對它們進行測量都可以提供寶貴的見解。

現在,您可以輕鬆計算您的數據的平均值、最大值和最小值,並測量您的數據的變化或傳播。有了這些功能,您可以更深入地了解您的數據,並根據分析做出知情的決策。

憑藉這些新知識,為什麼不擴展您的 PowerShell 工具包,並將 Compare-Object 添加到您的工具箱中呢?

Source:
https://adamtheautomator.com/powershell-measure-object/