
1 はじめに
【PowerShellを始める】第7回目は、
制御構文(control syntax)と関数(function)の概要についてです。
PowerShellって、従来のWindowsコマンドプロンプトやLinuxなどUNIX系のBashなどと
比べるとどうも難しい。
とにかく、コマンドレット(cmdlet)やオブジェクト(object)っていうのが、
よくわからない。
訳のわからない演算子もたくさんでてくる。
関数も、訳のわからない属性設定がいっぱいある。
それじゃー、わかるところを始めようとしたのは、この【PowerShellを始める】シリーズです。
本シリーズは、PowerShellにどのような要素があるのかをまとめただけであり、
実際にPowerShellを利用する際のインデックスであることを目的に構成しました。
【PowerShellを始める】シリーズの全容は、
最終章(4章 【PowerShellを始める】全容)に示します。
よければ、ご覧ください。
PowerShell個別の問題については、適宜記事にしていきたいと思っています。
2 制御構文
より複雑なスクリプトを記述するには、条件分岐やループなど、
コードの流れを制御するための「制御構文(control syntax)」も必要です。
PowerShellでは、条件分岐構文としてif ~ elseif ~ else、switch、
そしてループ構文としてfor、foreach、while、do ~ whileと、
ほかのスクリプト言語でもおなじみの制御構文が一通り提供されています。
表2-1に、本記事で説明するPowerShellの制御構文を示します。
2.1 ifステートメント
if、elseif、elseを使って、条件分岐を行います。
条件分岐は、「もし~なら、...をするといった、何かの条件で処理を行うことを指します。
if ステートメントについて知りたかったことのすべて
2.1.1 基本的なシンタックス
if ( <condition1> ) {
<statement list 1> }
[elseif ( <condition2> ) {
<statement list 2> }]
[else {
<statement list 3> }]
2.1.2 例
【ifのみの条件分岐】
1 2 3 |
if ( $a -gt 2 ) { Write-Host "The value $a is greater than 2." } |
【ifとelseの条件分岐】
1 2 3 4 5 6 7 |
if ( $a -gt 2 ) {<br> Write-Host "The value $a is greater than 2." } else { Write-Host "The value $a is less than or equal to 2," + "is not created or is not initialized." } |
【ifとelseif、elseの条件分岐】
1 2 3 4 5 6 7 8 9 |
if ( $a -gt 2 ) { Write-Host "The value $a is greater than 2." } elseif ( $a -eq 2 ) { Write-Host "The value $a is equal to 2." } else Write-Host "The value $a is less than 2 " + "or was not created or initialized." |
2.2 switchステートメント
switch文を使うと、複数の条件で処理を分岐できます。 switch ステートメントについて知りたかったことのすべて
2.2.1 基本的なシンタックス
switch( <test-value> ) {
<condition1> { <action1> }
<condition2> { <action2> }
...
default { <action-d> }
}
2.2.2 例
【シンプルなswitch】
1 2 3 4 5 6 7 8 |
switch( 3 ) { 1 { "It is one." } 2 { "It is two." } 3 { "It is three." } 4 { "It is four." } } It is three. |
【switchで条件式を使う】
1 2 3 4 5 6 7 |
switch( 6 ) { { $_ -lt 5 } { 'x < 5' } { $_ -lt 10 } { 'x < 10' } default { "default" } } x < 10 |
2.3 whileステートメント
while文は、条件を満たす限り、繰り返し処理(反復処理)を行います。
about_While
2.3.1 基本的なシンタックス
while( <condition> )
{
<statement list>
}
2.3.2 例
1 2 3 4 5 6 7 8 9 |
$val = 0 while( $val -ne 3 ) { $val++ Write-Host $val } 1 2 3 |
2.4 doステートメント
do文には、do-whileとdo-untilの2つがあります。
前者はwhileに指定した条件が成立する間、
後者はuntilに指定した条件に達するまで反復処理を行います。
about_Do
2.4.1 基本的なシンタックス
【do-while】
do {
<statement list>
} while ( <condition> )
【do-until】
do {
<statement list>
} until( <condition> )
2.4.2 例
【do-while】
1 2 3 4 5 6 7 |
$val = 4 do { $val++ Write-Host "do-while $val" } while( $val -le 3 ) do-while 5 |
【do-until】
1 2 3 4 5 6 7 |
$val = 4 do { $val++ Write-Host "do-until $val" } until( $val -ge 3 ) do-until 5 |
2.5 forステートメント
for文は、while文と同じように、条件を満たす限り繰り返し処理を行います。
about_For
2.5.1 基本的なシンタックス
for ( <init>; <condition>; <repeat> )
{
<statement list>
}
2.5.2 例
1 2 3 4 5 6 7 8 |
for( $i=0; $i -le 3; $i++ ) { Write-Host $i } 0 1 2 3 |
2.6 foreachステートメント
foreach文は、配列の要素を順次読み取って反復処理を行い、
配列の最後に到達すると自動的に止まるというものです。
about_Foreach
2.6.1 基本的なシンタックス
foreach ( $<item> in $<collection> )
{
<statement list>
}
2.6.2 例
1 2 3 4 5 6 7 8 |
foreach ( $file in Get-ChildItem ) { if( $file.Length -gt 100KB ) { Write-Host $file Write-Host $file.Length Write-Host $file.LastAccessTime } |
2.7 breakステートメント、continueステートメント
break文とcontinue文を使うことで、ループを抜けたり、次の反復処理に移ったりできます。
反復処理がある制御構文(while、do、for、 foreach、switch)で利用できます。
2.7.1 例
【break】
1 2 3 4 5 6 7 8 9 |
$i=0 $varB = 10,20,30,40 foreach( $val in $varB ) { if ( $val -eq 30 ) { break } $i++ } Write-Host "30 was found in array index $i" |
【continue】
1 2 3 4 5 6 7 8 9 10 |
while( $ctr -lt 10 ) { $ctr += 1 if( $ctr -eq 5 ) { continue } Write-Host -Object $ctr } |
3 関数
関数(function)は、利用者が割り当てる名前を持つPowerShellステートメントの列です。
関数を実行するときは、関数名を入力します。
PowerShellでは、次の2種類の関数が定義されています。
関数
名前で呼び出すことができるコードのブロックです。
入力と戻り値の出力を受け取ることができます。
関数は、”function”キーワードを使用して定義します。
フィルター
フィルターは、パイプラインからのデータを処理するように設計された関数の一種です。
フィルターは、”filter”キーワードを使用して定義します。
下に示す内容は、パイプラインで利用する関数である時に必要な知識のようですが、
事例が少々複雑になりますので本記事では割愛します。
3.1 関数の構文
3.1.1 基本的なシンタックス
関数は、次の構文を使用して定義します。
function [<scope:>] <name> {
param( [type]$Parameter1 [,[type]$Parameter2] )
dynamicparam { <statement list> }
begin { <statement list> }
process { <statement list> }
end { <statement list> }
clean { <statement list> }
}
関数には、次の項目が含まれています。
・functionキーワード
・スコープ(省略可能)
・選択した名前
・動的パラメーターを含む任意の数の名前付きパラメーター(省略可能)
・中かっこで囲まれた1つ以上のPowerShellステートメント”{}”
表3.1-1に、各ブロックの用途を示します。
function定義でキーワード(begin、process、end)を使用しない場合、
PowerShellはステートメントをendブロックに配置します。
3.1.2 例
下に、単純な場合の関数の例を示します。
1 2 3 4 |
function Get-PowerShellProcess { Get-Process pwsh } |
3.2 フィルター構文
3.2.1 基本的なシンタックス
filter関数の目的は、パイプライン内の各オブジェクトで実行される関数を簡単に定義する方法 を提供することです。
フィルターの構文は次のとおりです。
filter [<lscope:>]<name> { <statement list> }
3.2.2 例
下に示すフィルターの例は、パイプラインからログエントリを取得し、 エントリ全体またはエントリのメッセージ部分のみを表示します。
1 2 3 4 |
filter Get-EventMessage ([switch]$MessageOnly) { if ($MessageOnly) { Out-Host -InputObject $_.Message } else { $_ } } |
上の例は、次のように使用できます。
1 |
PS> Get-WinEvent -LogName System -MaxEvents 100 | Get-EventMessage -MessageOnly |
3.3 入力処理メソッド
関数のbegin、process、およびendブロックで使用されるメソッドは、
入力処理方法と呼ばれます。
関数でこれらのブロックを全て使用する必要はありません。
cleanブロックも、入力処理ではありませんが、必ず必要といったブロックではありません。
本記事では、詳細説明を割愛します。
3.4 パラメーター(引数)
関数には、次のタイプのパラメーター(引数)を定義することができます。
・名前付きパラメーター
・位置指定パラメーター
・スイッチパラメーター
・動的パラメーター
3.4.1 名前付きパラメーター
【基本的なシンタックス】
下に示す構文に示すように、”param”キーワードを使用して
中かっこ({})内でパラメーターを定義することができます。
function <name>
{
param ([type]$Parameter1 [,[type]$Parameter2])
<statement list>
}
次の構文のように、”param”キーワードを指定せず、
中かっこの外側にパラメーターを定義することもできます。
function <name> [([type]$Parameter1[,[type]$Parameter2])]
{
<statement list>
}
【例】
次の関数の例には、$Sizeパラメーターがあります。
この関数は、ディレクトリを除き、
$Sizeパラメーターの値より小さいすべてのファイルを表示します。
1 2 3 4 5 6 |
function Get-SmallFiles { param ($Size) Get-ChildItem $HOME | Where-Object { $_.Length -lt $Size -and !$_.PSIsContainer } } |
この関数は、次のように呼び出されます。
1 |
PS> Get-SmallFiles -Size 50 |
3.4.2 位置指定パラメーター
位置指定パラメーターは、パラメーター名のないパラメーターです。
PowerShellでは、パラメーター値の順序を使用して、 各パラメーター値を関数内のパラメーターに関連付けます。
位置指定パラメーターを使用する場合は、関数名の後に1つ以上の値を入力します。
位置指定パラメーター値は、$args配列変数に割り当てられます。
関数名の後の値は、$args配列の最初の位置($args[0])に割り当てられます。
【例】
次の関数の例は、指定したファイル名に”.txt”のファイル名拡張子を追加します。
1 2 3 4 |
function Get-Extension { $name = $args[0] + ".txt" $name } |
この関数は、次のように呼び出されます。
1 2 3 |
PS> Get-Extension myTextFile myTextFile.txt |
3.4.3 スイッチパラメーター
スイッチは、値を必要としないパラメーターです。
代わりに、関数名の後にswitchパラメーターの名前を入力します。
【基本的なシンタックス】
switchパラメーターを定義するには、
次の例に示すように、パラメーター名の前に”[switch]”型を指定します。
function Switch-Item
{
param ([switch]$On)
if ($On) { "Switch on" }
else { "Switch off" }
}
関数名の後に”On”のswitchパラメーターを入力すると、関数に”Switch on”が表示されます。
1 2 3 |
PS> Switch-Item -On Switch on |
switchパラメーターを指定しないと、”Switch off”が表示されます。
1 2 3 |
PS> Switch-Item Switch off |
3.5 関数の戻り値
関数の戻り値とは、関数が処理を実行した結果として返す値のことです。
戻り値を使用すると、関数が計算した結果や処理したデータを他のスクリプトやコマンドに
引き継いで使用することができます。
3.5.1 戻り値のデータ型
PowerShellの関数は、数値、文字列、配列、オブジェクトなど、
さまざまなデータ型を戻り値として返すことができます。
PowerShellは柔軟性が高いため、特定のデータ型に縛られることなく、
さまざまなデータを簡単に扱うことが可能です。
3.5.2 returnキーワードによる明示
returnキーワードを使うことで、関数から特定の値を明示的に戻すことができます。
return [ <xpression> ]
returnキーワードは単独で表示することも、値または式を続けて使用することもできます。
1 2 3 |
return return $a return( 2 + $a ) |
3.5.3 returnキーワードを使用されていない関数の戻り値
returnキーワードを含むステートメントがなくても、
各ステートメントの結果が出力として返されます。
1 2 3 4 5 |
function Say-Hello($Name) { "Hello $Name!" } PS> Write-Host( Say-Hello( "Yamada" ) ) # Hello Yamada! |
4 【PowerShellを始める】全容
その1:
ファイル・フォルダー操作のコマンドレットと外部コマンド
その2:
主要なコマンドレットと入出力、文字列操作
その3:
変数と配列、定数、データ型
その4:
PowerShellの演算子
その5:
PowerShellのオブジェクト
その6:
パイプラインとリダイレクション
その7:
制御構文と関数
その8:
スクリプティングと自動化
以上
本記事の元となっているWordで作成したPDFを
ページ最後に貼り付けました。
少しでも役に立てていただければ、うれしく思います。
このPDFファイルは、自由に配布されてもかまいません。
ただし、再配布の際には、
入手元と著者名は明らかにしてください。
なお、上のPDFファイルの内容、また本文中の記述に、
誤字や脱字、誤った内容の記述など見つかりましたら、
下に示すフォームでご連絡いただければ幸いです。