フィルタ、スクリプトブロック、変数のスコープ
HIRO [著] 2008/08/08 14:00

1 2 3 4 →

はじめに

 この連載では、Microsoftが提供している新しいシェル「Windows PowerShell」の使い方を解説します。今回は、フィルタ、スクリプトブロック、変数のスコープについて説明します。

これまでの記事

対象読者

  • Windows PowerShellでコマンドレット操作ができる方
  • 何らかのプログラミング経験があればなお良い

必要な環境

  • Windows PowerShell

フィルタ

 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終了時に消滅してしまうので、プロファイルに登録することをお奨めします(連載第7回の「関数をプロファイルに追加する」参照)。

 関数とフィルタの違いをまとめると、次のとおりです。

  • 関数は、パイプで受け取ったオブジェクトを一度に処理する
  • フィルタは、パイプで受け取った個々のオブジェクトごとに実行する

スクリプトブロック

 「スクリプトブロック」とは、他の言語で言う匿名関数やラムダ式に相当するものです。PowerShellにおいては中括弧{}で囲まれたスクリプトコードに過ぎません。

 例えば

PS > 1..10 | foreach { Write-Host $_ }

 と記述したときの、{ Write-Host $_ }はスクリプトブロックです。

スクリプトブロックを変数に代入する

 スクリプトブロックは、変数に代入することもできます。

 例えば下記は、変数$aを3倍するというスクリプトブロックを変数$sに代入したことになります。

PS > $s = { $a * 3 }

スクリプトブロックを実行する

 では、スクリプトブロックを実行するにはどうすれば良いでしょうか?

PS > $s

 上記のように変数名を入力して[Enter]を押すだけでは実行することができません。

 スクリプトブロックを実行するには、下記のように &演算子を使用します。

PS > $a =2
PS > & $s
6

 スクリプトブロックではparamによる引数の受け取りが可能です。下記のスクリプトブロックは、paramで引数を1つ受け取り、引数を3倍します。

PS > $script = { param($a); $a * 3 }

 実行方法は、先ほど説明したように&演算子を使用して変数名を指定し、その後に引数として渡す値を記述します。

PS > & $script 5
15

 もう1つ、$argsによる値の受け取りも可能です。先ほどのスクリプトブロックを$argsで書き換えてみたのが下記です。

PS > $script = { $args[0] * 3 }

 実行方法は、paramのときと同様です。

PS > & $script 5
15

1 2 3 4
→
INDEX
Windows PowerShell 入門(8)-関数編3
Page1
はじめに
対象読者
必要な環境
フィルタ
スクリプトブロック
変数のスコープ
まとめ
プロフィール
HIRO ヒロ

HIRO's.NETのHIROです。
とある半導体工場のSEです。
VB.NET, C#, PowerShellによるプログラミングを楽しんでいます。
最近はBlog でPowerShellについて書いています。

2008/07/07にPowerShell from Japan!!というサイトを立ち上げました。PowerShellユーザーが集まってブログを書いています。よろしかったら来てください。

HIRO's.NET Blog
HIRO's.NET - VB.NET, C#, PowerShell Tips -
PowerShell from Japan!!
PowerShell from Japan!! Wiki


注目の求人情報
システムエンジニア/人材紹介WEBポータル
・UNIX、Linuxベースの開発経験 ・PHP、JAVA、PostgreSQL、MySQLなどの経験2年以上 ・オブジェクト指...
システムエンジニア/外資ITソリューション
ビジネス課題に対応したソリューションのテクノロジー、アーキテクチャ設計・構築 マイクロソフト製品...
ビジネス戦略・事業運営/ITベンチャーファーム
コンサルティングやITサービスに関するセールスを行います。また、自分の営業チームをあたかも社内ミニ...

(最新日付順)
名前(ゲストの方もコメントをどうぞ):*
アイコン:
なし

内容(テキストのみ1200文字まで):*

投稿規定に同意して

スポンサーサイト

この記事のトラックバックURL: