[PowerShell] | |||||||||
PowerShellでよく使うパイプライン経由の処理をフィルタとして定義する――「フィルタ」の基本的な使い方――
|
|||||||||
|
解説 |
PowerShellでは、パイプライン経由で渡されたオブジェクトに対して何らかの処理を施すことで、必要なデータだけを取り出したり、順番に処理したり、あるいは出力形式を整形したりといった操作を行うことがよくある(別稿「Windows PowerShellコマンド&スクリプティング入門」を参照)。例えば、カレント・フォルダから最終更新日が6カ月以上前のファイルだけを取得したければ、次のように記述する。
PS C:\WINDOWS> Get-ChildItem | Where-Object {$_.LastWriteTime -lt (Get-Date).AddMonths(-6)} |
Where-Objectコマンドレットは、パイプ経由で渡された入力オブジェクトを特定の条件式(フィルタ・スクリプト)で比較し、合致したオブジェクトのみを出力するものだ。
もっとも、この程度のコードで記述できてしまうとはいえ、頻繁に利用する条件であれば(あるいは条件自体が複雑にもなれば)、これを毎回タイプするのは面倒だ。
そこで登場するのが「フィルタ(Filter)」である。フィルタとは、パイプライン上のオブジェクトを処理するための関数(Function)の一種であると考えればよい。よく利用するパイプライン処理をフィルタとして外部化しておけば、同じようなコードを繰り返し記述する必要がなくなるので、コマンドを簡潔に記述できる。
操作方法 |
*注意 |
PowerShellを利用するには、あらかじめシステムにユーザー自身がインストールしておく必要があります。具体的なインストール方法については「PowerShellをインストールする」を参照してください。 |
フィルタの例として、ここでは、「パイプライン経由で受け取ったオブジェクト(ファイル情報)から、最終更新日が$span月以上前のもののみを取り出す」Get-Oldフィルタを定義してみよう。
手順1――テキスト・エディタでPowerShellのコードを入力する
まずはテキスト・エディタ(メモ帳でも何でもよい)を開き、以下のコードを入力してほしい。なお「#〜」で始まる行は、コードの意味を解説するためのコメント部分なので、省略してもよい。コメントにはスクリプトの簡単な説明を入れておいた。
|
|
※サンプル・ファイルprofile.ps1をダウンロードするには、ここをクリックしてください。 |
フィルタを定義する構文は、(functionキーワードではなく)filterキーワードを利用することを除けば、関数を定義する場合とほとんど同様である。
filter フィルタ名 [(引数[=デフォルト値],...)] { |
ただしfilterブロックの中では、パイプライン経由で渡されたオブジェクトを自動変数「$_」を使って参照できる点に注目していただきたい。ここでは、この自動変数$_を介して、渡されたオブジェクトのLastWriteTimeプロパティ(最終更新日時)を参照し、その値が$span月前よりも古ければ(「-lt」=「less than」。「以下」という意味)、オブジェクト自身を返している。これによって、最終更新日時が$span月以上前のオブジェクトだけをフィルタリングしているわけだ。
なお、このようなフィルタをPowerShell起動のたびに手動で実行するのは現実的ではない。そこで、ここではフィルタをプロファイルとして登録しておくことにしよう(*)。プロファイルとして登録するには、ファイル名を「profile.ps1」とし、保存先のフォルダは「C:\WINDOWS\SYSTEM32\windowspowershell\v1.0」とする必要がある(ユーザー単位にプロファイルを区別したければ、「C:\Documents and Settings\<ユーザー名>\My Documents\WindowsPowerShell」フォルダでもよい)。
* プロファイルとは、起動時に決められたスクリプトを読み込み、実行するための機能のこと。詳細は別稿「Windows PowerShellコマンド&スクリプティング入門(後編)」やTIPS「PowerShellのプロンプト文字列をカスタマイズする」も参照。 |
すでにprofile.ps1が存在する場合には、元のコードを削除せずに、ファイルの末尾に上記リストの内容を追加する。
手順2――フィルタの動作を確認する
繰り返しであるが、profile.ps1の内容はPowerShellの起動時に自動的に呼び出されるので、フィルタ登録のための特別な手続きは必要ない。新たなシェルを起動したうえで、試しに以下のようなコードを実行してみよう。
Get-ChildItem | Get-Old |
これによって、冒頭で紹介した例と同様の結果が得られれば成功だ。ここでは引数を省略しているが、もしも最終更新日が10カ月以上前のファイルのみを抽出したい場合には、以下のように記述すればよい。
Get-ChildItem | Get-Old(10) |
関数でパイプライン処理を記述する場合
実は、フィルタによるパイプライン処理は、普通の関数(Function)で書き直すこと「も」可能である。以下は、先のGet-Oldフィルタを関数で書き換えたものだ。
function Get-OldFunc($span=6) { |
フィルタと関数とが大きく異なる点は、フィルタが「パイプライン経由で渡される個々のオブジェクトに対して、複数回実行される」のに対し、関数は「パイプライン経由で渡されたオブジェクト群に対して、まとめて1回だけ実行される」という点だ。
従って関数ではパイプライン経由で渡されるオブジェクト個々にアクセスする自動変数$_も利用できない。代わりに、パイプラインから渡されたオブジェクト群にアクセスする特殊な変数「$input」を使用する必要がある。よって、関数では必ず反復処理を記述しなければならず、フィルタよりも記述が冗長になりやすい。
また、構文的な違いだけではない。このような処理方法の違いから、一般的には、関数の方がフィルタよりも多くのメモリを必要とする。半面、一括してオブジェクトを取得するため、処理の内容によっては、関数の方が高速に動作する可能性がある。
ささいな違いでもあり、通常の用途ではほとんど気にする必要はないが、処理の重いスクリプトを記述する場合には、この違いを意識しながら両者を使い分けるとよいだろう。
この記事と関連性の高い別の記事
- ネットワーク・モニタ3.0の表示フィルタを活用する(TIPS)
- Excelでユーザー定義のワークシート関数を追加する(TIPS)
- ネットワーク・モニタで特定のプロトコルだけを表示させる(TIPS)
- PowerShellからVBScript/JScriptのコードを利用する(TIPS)
- PowerShellのプロンプト文字列をカスタマイズする(TIPS)
このリストは、デジタルアドバンテージが開発した自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。

![]() |
「Windows TIPS」 |
- Azure Web Appsの中を「コンソール」や「シェル」でのぞいてみる (2017/7/27)
AzureのWeb Appsはどのような仕組みで動いているのか、オンプレミスのWindows OSと何が違うのか、などをちょっと探訪してみよう - Azure Storage ExplorerでStorageを手軽に操作する (2017/7/24)
エクスプローラのような感覚でAzure Storageにアクセスできる無償ツール「Azure Storage Explorer」。いざというときに使えるよう、事前にセットアップしておこう - Win 10でキーボード配列が誤認識された場合の対処 (2017/7/21)
キーボード配列が異なる言語に誤認識された場合の対処方法を紹介。英語キーボードが日本語配列として認識された場合などは、正しいキー配列に設定し直そう - Azure Web AppsでWordPressをインストールしてみる (2017/7/20)
これまでのIaaSに続き、Azureの大きな特徴といえるPaaSサービス、Azure App Serviceを試してみた! まずはWordPressをインストールしてみる
![]() |
|
|
|
![]() |