はじめに
この連載では、Microsoftが提供している新しいシェル「Windows PowerShell」の使い方を解説します。今回は、フィルタ、スクリプトブロック、変数のスコープについて説明します。
これまでの記事
- Windows PowerShell 入門(1)-基本操作編
- Windows PowerShell 入門(2)-基本操作編 2
- Windows PowerShell 入門(3)-スクリプト編
- Windows PowerShell 入門(4)-変数と演算子編
- Windows PowerShell 入門(5)-制御構文編
- Windows PowerShell 入門(6)-関数編1
- Windows PowerShell 入門(7)-関数編2
対象読者
- 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