[ホーム] > [間違えやすい類語 IT編一覧] > [select-object とForEach-object の違い、使い分け | 縦処理と横処理の間隔]

select-object とForEach-object の違い、使い分け | 縦処理と横処理の間隔

作成日:2020/01/29 更新日:2023/11/14

Windows 標準のシェルである Powershell は強力で簡単にオブジェクトを扱える便利なシェルです。以前のバッチファイルは文字列ベースでしたが、Powershellは配列やオブジェクトとして変数を簡単に扱うことができます。

しかしオブジェクトが入った配列など特定の情報を取り出すときに困難になる場合があります。色々方法があると思いますが、基本的な考え方をここで紹介します。

配列やオブジェクトを扱うコマンドレットは多数ありますが、"select-object"と"ForEach-object"は理解してマスターするべきでしょう。

次の図はオブジェクトの配列を処理するイメージです。横方向にはselect-objectでオブジェクトを取り出します。各配列に関してはForEach-objectで各配列の要素を処理します。

select-object と ForEach-objectの違い

(注意)分かりやすく簡単に記載しており、一部の環境や分野では記載内容が異なる可能性があります。あくまでも参考程度でお読みください。

比較表

比較は以下の表の通りとなります。

説明select-objectForEach-object
概要オブジェクトの一部を選択する配列の要素をループ処理する

実行例


次はWindows Server における DNSサーバのエントリ(Aレコード)の出力例です。DNSサーバに登録されたAレコードの一覧が出力されています。


PS C:\> Get-DnsServerResourceRecord -zonename "testdomain.local" -rrtype "A"

HostName RecordType Type Timestamp TimeToLive RecordData
-------- ---------- ---- --------- ---------- ----------
server01 A 1 0 01:00:00 10.0.0.1
server02 A 1 0 01:00:00 10.0.0.2
server03 A 1 0 01:00:00 10.0.0.3



ここからHostnameとRecordData のみ取り出したい場合は select-object を使用します。(イメージ的には横への処理です)RecordDataはさらにオブジェクトなので表示はDnsServerResourceRecordA のまま表示されています。


PS C:\> Get-DnsServerResourceRecord -zonename "testdomain.local" -rrtype "A" | select-object Hostname,RecordData

Hostname RecordData
-------- ----------
server01 DnsServerResourceRecordA
server02 DnsServerResourceRecordA
server03 DnsServerResourceRecordA



各DNSエントリのIPアドレスを取得したい場合は、Foreach-objectにより配列の各要素を処理することにより実現します。イメージ的には"縦"の処理です。


PS C:\> Get-DnsServerResourceRecord -zonename "testdomain.local" -rrtype "A" | select-object RecordData | Foreach-object
{($_.RecordData).IPv4Address.IPAddressToString}

10.0.0.1
10.0.0.2
10.0.0.3



[ホーム] > [間違えやすい類語 IT編一覧]
,







【注意】本ページは著作権で保護されています。内容は何人も補償しません。時間的あるいは金銭的損失等、一切保証しません。

理解しやすく記載されており、一部不正確な記載がある可能性があります。ご自身の責任で参考にしてください。