PowerShell Measure-Object:例と完全なガイド

オブジェクトの数値的なプロパティ、例えば文字、単語、および文字列オブジェクト内の行の計算や数え上げは、イライラすることがあります。幸いなことに、Measure-Objectコマンドレットはそのタスクに対応しています。

このチュートリアルでは、Measure-Objectコマンドレットの強力さを学び、PowerShellでオブジェクトのプロパティを計測する自動化の方法を理解します。

さっそく始めて、オブジェクトの計測スキルを向上させましょう!

前提条件

このチュートリアルは実演形式です。一緒に進むには、PowerShellがインストールされたシステムが必要です。このチュートリアルでは、PowerShell v7を搭載したWindows 10が使用されています。

ファイルとフォルダの数を数える

ディレクトリ内のファイルとフォルダの数を知ることは、さまざまなシナリオで役立ちます。例えば、フォルダのサイズを監視したり、ディレクトリ内のファイルの数を確認する必要がある場合があります。

Measure-Objectコマンドレットはディレクトリ内のファイルとフォルダの数を数えます。正確な数は、システムリソースをより良く管理し最適化するのに役立ちます。

Measure-Objectコマンドレットがファイルとフォルダの数を数える方法を確認するには:

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. 次に、ステップ1で行ったのと同じコマンドを実行します。ただし、今回は-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スクリプトファイルに保存して実行してください。

次に、次のコマンドを実行して、現在のディレクトリにあるファイルを取得し、そのサイズ($_.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で測定し、測定値をWrite-Hostで出力します。

# ファイルパスとコンテンツを定義
$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 および $false)。
$values = $true,$false,$false,$true,$true,$true,$false,$false,$true
# 真の値(デフォルト)の合計を測定します。
$values | Measure-Object -Sum

以下、真偽値の合計は9(9)であり、Sumは5(5)です。なぜなら、真の値だけがカウントされるからです。

偽の値はどうですか?次の手順に進み、さらにいくつかのコマンドを実行してください。

Counting the number of true values in an array

次に、下記のコードを実行して、真の値の合計($trueCount)を全体の真偽値のカウント($count)から引きます。式からの差分は、偽の値の合計($falseCount)です。

# 配列内の真偽値の合計を取得
$count = $values.Count
# 真の値の合計を取得
$trueCount = ($values | Measure-Object -Sum).Sum
# 全体の真の値の合計を全体の真偽値から引きます
# 偽の値の合計を取得します
$falseCount = $count - $trueCount
# 真と偽の値の合計を表示します
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プロパティを持つ3つのハッシュテーブルを含むハッシュテーブルを作成
$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"

統計学では、平均は中心傾向を測定し、データセットの典型的なまたは最も代表的な値を説明します。

平均は、データセット内のすべての数値を合計して、総数で割ることによって計算されます。この例では、データセットは{1020304050}であり、合計は150で、セット内には5つの数値(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`コマンドレットはそのタスクを完了するための強力なツールです。このチュートリアルでは、さまざまな方法でデータを計測する方法を学びました。ファイル、テキストファイルの内容、ブール値、文字列、配列、またはハッシュテーブルを扱っている場合でも、それらを計測することで有益な洞察を得ることができます。

これで、データの平均値、最大値、最小値を簡単に計算し、データの変動や拡がりを測定することができます。これらの機能を使用すると、データをより深く理解し、分析に基づいて的確な判断を行うことができます。

この新たな知識を活用して、なぜPowerShellツールキットを拡張して、`Compare-Object`を武器に加えないのでしょうか?

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