Monday, June 02, 2008

PowerShellには、関数とは別にパイプを通して受け取ったオブジェクトを処理するフィルタと呼ばれるものがあります。

書式は関数とほぼ一緒なのですが、functionの代わりにfilterキーワードを使用します。

filter <フィルタ名> (引数) {実行するスクリプト}

関数と同様、結果をreturnで返すことも可能です

 

唐突ですが、ここで問題です。

「現在稼働しているサービス一覧を取得してください」と言われたら皆さんならどうしますか?

答えは下記の通りです(一例です)

PS > Get-Service | Where { $_.Status -eq "Running" }

Status   Name               DisplayName
------   ----               -----------
Running  AeLookupSvc        Application Experience
Running  AppHostSvc         Application Host Helper Service
Running  AudioEndpointBu... Windows Audio Endpoint Builder
Running  Audiosrv           Windows Audio
Running  BFE                Base Filtering Engine
:
:長いので省略
:

Get-ServiceコマンドレットとWhereを使用してステータスが"Running"のものをフィルタしています。

この $_.Status -eq "Running" はフィルタ化することが可能です。

では、フィルタ名を StsRunning としてフィルタを作成してみましょう。

PS > filter StsRunning {
>> if ( $_.Status -eq "Running" )
>> {
>>   return $_
>> }
>> }
>>

こうして作成したフィルタの使用方法は簡単で、パイプの後ろに記述するだけです。

PS > Get-Service | StsRunning

Status   Name               DisplayName
------   ----               -----------
Running  AeLookupSvc        Application Experience
Running  AppHostSvc         Application Host Helper Service
Running  AudioEndpointBu... Windows Audio Endpoint Builder
Running  Audiosrv           Windows Audio
Running  BFE                Base Filtering Engine

このように、よく使用するフィルタ条件は、専用のフィルタを作成しておくと便利です。

フィルタはコンソール上で作成すると、PowerShell終了時に消滅してしまうので、プロファイルに登録することをおすすめします。(「関数をプロファイルに追加する」をご参考ください)

最後に、関数とフィルタの違いについてですが

関数は、パイプで受け取ったオブジェクトを一度に処理する

フィルタは、パイプで受け取った個々のオブジェクトごとに実行する

という違いがあります。

Monday, June 02, 2008 11:02:33 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Comments are closed.

Theme design by Jelle Druyts

Pick a theme: