PowerShellのMeasure-Objectでファイル集計やテキスト解析を行う基本仕様と活用法を整理する

PowerShellカテゴリを表すパンダのイラスト PowerShell

この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。参照元の情報をもとに整理していますが、筆者による実機確認は行っていません。

検証ステータス:unverified(実機未確認)

PowerShellのMeasure-Objectコマンドレットは、パイプラインから渡されたオブジェクトの数値プロパティを集計したり、テキストの行数・単語数・文字数を計測したりするための標準ユーティリティです。集計対象や指定するパラメータに応じて、数値統計用のGenericMeasureInfoまたは文字列カウント用のTextMeasureInfoオブジェクトを出力します。

Measure-Objectの概要と2つのパラメータセット

Measure-Object(エイリアス: measure)は、渡されたオブジェクトのプロパティ値をもとに計算処理を行うコマンドレットです。一次情報によると、このコマンドレットには大きく分けて2種類のパラメータセット(Generic MeasureとText Measure)が存在します。

数値プロパティを対象とするGeneric Measureセットでは、オブジェクトの総数(Count)に加えて、最小値、最大値、合計値、平均値、標準偏差などを計算できます。一方で、テキストデータを対象とするText Measureセットでは、文字列やテキストファイル内の行数(Line)、単語数(Word)、文字数(Character)を計測できます。

パイプライン経由でオブジェクトを渡すことで、フォルダ内のファイルサイズの合算や、テキストログの規模の把握をワンライナーで柔軟に記述できる点が特徴です。

数値集計(Generic Measure)の主要機能とパラメータ

Generic Measureパラメータセットでは、オブジェクトの数値プロパティに関する統計情報を算出します。一次情報に記載されている主なスイッチパラメータとプロパティの仕様は以下のとおりです。

  • -Property: 測定対象とするプロパティ名を指定します。プロパティのみを指定し他の統計スイッチを省略した場合、該当プロパティを持つオブジェクトの個数をカウントします。

  • -Sum: 指定したプロパティの合計値を算出します。

  • -Average: 指定したプロパティの平均値を算出します。

  • -Minimum: 指定したプロパティの最小値を算出します。

  • -Maximum: 指定したプロパティの最大値を算出します。

  • -StandardDeviation: 指定したプロパティの標準偏差を算出します。

  • -AllStats: 合計、平均、最小、最大、標準偏差などの統計情報をまとめて算出します。

また、真偽値(Boolean)プロパティに対しても計算が可能であり、たとえばPSIsContainerプロパティを集計することで、ディレクトリ内のフォルダとファイルの割合を算出するといった使い方が一次情報で示されています。

文字列解析(Text Measure)の行数・単語数・文字数カウント

テキストや文字列オブジェクトに対しては、Text Measureパラメータセットを利用して詳細な計測が行えます。

  • -Line: 入力オブジェクト内の行数をカウントします。改行文字(`n)が含まれる場合は分割してカウントされます。

  • -Word: 単語数をカウントします。各入力オブジェクトの内部およびオブジェクトをまたいだ全体の単語数が集計されます。

  • -Character: 文字数をカウントします。

  • -IgnoreWhiteSpace: 文字数をカウントする際に空白文字(スペース等)を除外します。一次情報では、既定では空白文字も文字数に含まれると説明されています。

一次情報によれば、Get-Contentで読み込んだテキスト配列をパイプラインで渡すことで、テキストファイル全体の構造を簡単に把握できます。出力されるオブジェクトの型はTextMeasureInfoとなります。

PowerShell 6以降および7.3における機能強化と動作仕様

Measure-ObjectはPowerShellのバージョンアップに伴い、複数の機能追加や挙動の改善が行われています。

  1. PowerShell 6以降の拡張

    • AllStatsパラメータ: すべての統計指標を一度に取得できるようになりました。

    • スクリプトブロックによる計算プロパティ: -Property { $_.Length / 1MB } のようにスクリプトブロックを指定し、MB単位に変換した値の合計などを直接計算できるようになりました。

    • ハッシュテーブル入力のサポート: ハッシュテーブルのキー名をプロパティとして指定し、最大値や合計値を取得できます。

    • ワイルドカード指定: プロパティ名にワイルドカード(例: *paged*memory*size)を使用して、一致する複数のプロパティを個別に集計可能です。

    • 標準偏差のサポート: -StandardDeviationパラメータにより、プロセス使用量などのばらつきを数値化できるようになりました。

  2. PowerShell 7.3以降のエラー処理仕様

    • 測定対象のプロパティが存在しないオブジェクトを処理する場合、PowerShell 7.3以降では通常エラーを返さなくなりました。

    • ただし、StrictModeが有効化されている環境では、存在しないプロパティを処理しようとするとSystem.Management.Automation.PSArgumentExceptionがスローされる仕様となっています。

Measure-Objectの判定・処理フロー

Measure-Objectが入力データとパラメータに応じてどのような出力を行うかの関係を整理すると、以下のようになります。

flowchart TD
    A[入力オブジェクトの受け取り] --> B{指定パラメータの判定}
    B -->|Line / Word / Character| C[テキスト解析処理]
    B -->|Property / 統計スイッチ / AllStats| D[数値統計処理]
    B -->|パラメータ指定なし| E[オブジェクト総数のカウント]
    C --> F[TextMeasureInfo を出力]
    D --> G[GenericMeasureInfo を出力]
    E --> G

一次情報に記載されているとおり、指定するスイッチパラメータの系統によって呼び出される内部処理が分かれ、最終的に生成される出力オブジェクトの型(GenericMeasureInfoまたはTextMeasureInfo)が決定されます。

業務自動化における記述例と確認の観点

実際のシステム管理や自動化業務で想定される基本的な記述パターンを整理します。

1. フォルダ内ファイルの合計サイズ集計

フォルダ内のファイル容量やサイズ分布を確認する例です。

# 保存名: Measure-FolderSize.ps1


# 実行前提: PowerShell 6以降(スクリプトブロックによる単位換算を利用するため)


# 期待できる確認内容: カレントディレクトリ配下のファイル総数、平均、最小、最大、合計サイズ(MB単位)

Get-ChildItem -File | Measure-Object -Property { $_.Length / 1MB } -Sum -Average -Minimum -Maximum

【実機確認前】このコマンドにより、各ファイルのLengthプロパティがMB単位に変換され、合計値や平均値がGenericMeasureInfoとして算出されると一次情報から読み取れます。

2. ログファイルの行数および文字数計測

ログファイルやテキストファイルの行数・単語数・文字数をまとめて調べる例です。

# 保存名: Measure-LogText.ps1


# 実行前提: 対象のテキストファイル(C:\Temp\app.log)が存在すること


# 期待できる確認内容: 行数(Lines)、単語数(Words)、文字数(Characters)の集計値

Get-Content -Path "C:\Temp\app.log" | Measure-Object -Line -Word -Character -IgnoreWhiteSpace

【実機確認前】改行コードや空白文字の扱いを-IgnoreWhiteSpaceで制御しながら、ファイル規模を数値として取得できる想定です。

実務でパイプライン処理を行う際の注意点

一次情報の記載から確認できる、実務上の重要な境界条件や留意点は以下のとおりです。

  1. InputObjectパラメータの直接指定に関する挙動

    • Measure-Object -InputObject $data のように直接変数を渡すと、配列全体が「1つのオブジェクト」として評価されてしまい、個数が1件とカウントされる場合があります。

    • コレクション内の各要素を正しく評価・集計するには、$data | Measure-Object のようにパイプライン経由で渡すことが公式に推奨されています。

  2. StrictMode環境での挙動差異

    • 異なる種類のオブジェクトが混在するコレクション(例: Get-ServiceとGet-Processの混合配列)に対して特定のプロパティ(DisplayNameなど)を集計する場合、PowerShell 7.3以降では存在しないプロパティは自動的にスキップされます。

    • しかしスクリプト内でSet-StrictModeが有効になっていると例外が発生するため、複数型が混在するデータを集計する際は事前フィルタリング(Where-Objectなど)を行うか、動作モードを確認する必要があります。

まとめ

Measure-Objectの仕様を理解することで、ワンライナーによる迅速な状況把握からスクリプトによる自動集計まで幅広く対応できます。実行前に確認すべき点と制約は以下のとおりです。

  • 実行環境のバージョン確認: スクリプトブロックプロパティや-AllStats、-StandardDeviationなどの機能を使用する場合は、PowerShell 6以降が必須となります。

  • パイプライン利用の徹底: オブジェクト配列の各要素を集計する際は、-InputObjectではなくパイプライン入力を利用する構成になっているか確認してください。

  • StrictModeの影響: PowerShell 7.3以降であっても、厳格モード下ではプロパティが存在しないオブジェクトに対して例外が発生する制約があります。

  • 集計対象のデータ型: 文字列解析(Text)と数値計算(Generic)で利用可能なパラメータセットが異なるため、目的に応じたスイッチの選定が必要です。

参考情報

文書情報

記事タイトル
PowerShellのMeasure-Objectでファイル集計やテキスト解析を行う基本仕様と活用法を整理する
作成日
更新日
Source URL
https://papanda925.com/?p=17837

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

タイトルとURLをコピーしました