Windows PowerShellにおける制御構文について学びます。数ある制御構文の中でもSwitch文は、他の言語に比べ豊富な機能が用意されています。
if文は、条件分岐をする上で欠かせない構文です。構文は次の通りです。
if文 if (<条件>) { <ifの条件が満たされた場合に実行されるコードブロック> } elseif (<条件>) { <elseifの条件が満たされた場合に実行されるコードブロック> } else { <前の条件がいずれも満たされない場合に実行されるコードブロック> }elseifはいくつでも記述することができますが、elseは1つまでです。どちらも省略することができます。
下記は$filesize変数に代入されている値をif文で判断してメッセージを表示する例です。比較演算子に関しては前回の記事を参照願います。
if文の例 PS > $filesize = 2MB PS > if ( $filesize -lt 1MB ) >> { >> Write-Host("1MBより小さい") >> } >> elseif ( $filesize -lt 2MB ) >> { >> Write-Host ("2MBより小さい") >> } >> else >> { >> Write-Host("2MB以上") >> } >> 2MB以上forは基本的なループです。forの構文は次の通りです
for文 for (<初期化>; <条件>; <繰り返し処理>) { <繰り返し実行するコードブロック> }下記はfor文を使用してカウントを表示する例です
for文の例 PS > for ( $i = 0; $i -lt 5; $i++ ) >> { >> Write-Host ("カウント" + $i) >> } >> カウント0 カウント1 カウント2 カウント3 カウント4whileは指定した条件がtrueの場合にループし続けます。whileの構文は次の通りです
while文 while (条件) { <繰り返し実行するコードブロック> }下記は変数$cntが10以下の場合ループし続けます。{ ~ }の中のコードブロックが実行される度に$cntがインクリメントされ、10以上になったときに条件を満たしループを終了します。
PS C:\Work> $cnt = 0 PS C:\Work> while ( $cnt -le 10 ) >> { >> Write-Host "Count: $cnt" >> $cnt++ >> } >> Count: 0 Count: 1 Count: 2 Count: 3 Count: 4 Count: 5 Count: 6 Count: 7 Count: 8 Count: 9 Count: 10先ほどのwhile文は最初に評価が行われるループでした。これから説明するdo/while文は最後に評価が行われるループです。最後の評価が「偽」となった時点でループを終了します。よって、必ず1回は処理の実行を行います。
do/whileの構文は次の通りです。
do/while文 do { <繰り返し実行するコードブロック> } while (条件)下記は変数$iが5未満の場合実行します。
do/whileの例 PS C:\Work> $i = 0 PS C:\Work> do >> { >> Write-Host $i >> $i++ >> } >> while ($i -lt 5) >> 0 1 2 3 4foreachはコレクションに含まれるすべての項目を順番に処理します。構文は次の通りです。
foreach文 foreach ($<項目> in $<コレクション>) { <繰り返し実行するコードブロック> }よく知られたコレクションの一つに配列があります。下記は配列変数$weekdayから値を1つずつ取り出して表示します。
foreachの例1 PS > $weekday = "Mon","Tue","Wed","Thu","Fri" PS > foreach ($w in $weekday) >> { >> Write-Host $w >> } >> Mon Tue Wed Thu Friもう1つ例を示したいと思います。
下記はGet-Serviceコマンドから返される項目でStatusが「Running」になっているサービス名を表示します(Get-Serviceコマンドレットはローカルコンピュータ上のサービスを取得します)。
foreachの例2 PS > foreach ( $s in Get-Service ) >> { >> if ($s.Status -eq "running") >> { >> Write-Host $s.ServiceName >> } >> } >>breakはループ制御(foreach、for、while、do)およびswitchのコードブロック内で出現した場合、そこでそのコードブロックを終了します。
下記はforループによってコードブロックが5回繰り返される例ですが、ループ内で条件が満たされた場合はループ回数が5に到達する前にbreakによりループを終了します。実行結果を見ていただくと分かるとおり、breakが実行された以降のコマンドは実行されません。
break文の例 PS> for ( $i = 0; $i -lt 5; $i++ ) >> { >> if ( $i -eq 3 ) >> { >> break >> } >> Write-Host $i >> } >> 0 1 2次にcontinueですが、continueが実行されると、実行フローはループの先頭へ移動し、次の反復処理を行います。breakと異なるのは、ループを終了しないことです。
以下はif文で$i % 2が真の場合(計算結果が奇数)にcontinueが実行され、実行フローがループの先頭であるforに移動します。
よって、実行結果は偶数が表示されます。
continue文の例 PS > for ( $i = 0; $i -lt 10; $i++ ) >> { >> if ( $i % 2 ) >> { >> continue >> } >> Write-Host $i >> } >> 0 2 4 6 8PowerShellにおけるswitch文は、他の言語同様、処理を分岐するほか、パターン照合や反復を行うことも可能です。いくつかの例と共に説明します。
まず構文は次の通りです。
swich文 switch -options (評価する式) { <パターン> {実行するコマンドブロック} <パターン> {実行するコマンドブロック} : default {実行するコマンドブロック} }以下の例は$Yearを評価し、<パターン>と一致する箇所の{実行するコマンドブロック}を処理します。$Yearには"2008"をあらかじめセットしているので、コンソールウィンドウへは"今年"と表示します(例1)。
switch文の例1 PS > $Year = 2008 PS > switch ( $Year ) >> { >> 2007 { Write-Host "昨年" } >> 2008 { Write-Host "今年" } >> 2009 { Write-Host "来年" } >> } >> 今年では、一致するパターンが2つある場合がどうなるかを見てみましょう。以下は一致するパターン"2008"が2つある例です(例2)。一致するパターンが2つあるので、結果として2つのパターンの"2008"に対応する{実行するコマンドブロック}を処理します。
switch文の例2 PS > $Year = 2008 PS > switch ( $Year ) >> { >> 2007 { Write-Host "昨年" } >> 2008 { Write-Host "今年" } >> 2008 { Write-Host "This Year!"} >> 2009 { Write-Host "来年" } >> } >> 今年 This Year!次に、先ほど学んだbreak文を使用する例を見てみましょう。先ほどの例に手を加え、最初のパターンにbreakを仕掛けてあります。その結果"今年"を表示し、処理を中断します(例3)。
switch文の例3 PS > $Year = 2008 PS > switch ( $Year ) >> { >> 2007 { Write-Host "昨年" } >> 2008 { Write-Host "今年"; break } >> 2008 { Write-Host "This Year!"} >> 2009 { Write-Host "来年" } >> } >> 今年次に、どのパターンにも一致しない場合に処理を行うdefault節についてみてみましょう。変数$Yearには"2006"が代入されているため、一致するパターンがありません。しかし、次の例のようにdefault節が設定されてあるので"一致するパターンなし"と表示します(例4)。
switch文の例4 PS > $Year = 2006 PS > switch ( $Year ) >> { >> 2007 { Write-Host "昨年" } >> 2008 { Write-Host "今年" } >> 2009 { Write-Host "来年" } >> default { Write-Host "一致するパターンなし" } >> } >> 一致するパターンなし通常、switch文は大文字と小文字を区別しません。大文字と小文字を区別するには、-casesensitiveオプションを使用します(例5)。
switch文の例5 PS > switch -case ("POWERSHELL") >> { >> "powershell" {"小文字の方に一致"} >> "POWERSHELL" {"大文字の方に一致"} >> default {"一致なし"} >> } >> 大文字の方に一致次に-wildcardオプションの使用方法について説明します。-wildcardオプションを使用すると、ワイルドカードによるパターン一致の評価を行うことができます。次の例は"P"で始まる文字列と"l"で終わる文字列の2種類をパターンとして指定しています(例6)。
switch文の例6 PS > switch -wildcard ("PowerShell") >> { >> "P*" { Write-Host "Pで始まる"} >> "*l" { Write-Host "lで終わる" } >> } >> Pで始まる lで終わる-regexオプションを使用すると、正規表現によるパターン一致の評価を行うことができます。次の例では、正規表現を利用して、文字列の先頭が"P"で始まっているパターン一致の評価を行います(例7)。
switch文の例7 PS > switch -regex ("PowerShell") >> { >> "(^P)" {"PowerShell"} >> } >> PowerShellPowerShellのswitch文は他の言語とは異なり、ファイルの操作を行うことも可能です。ファイル操作を行うには-fileオプションを使用します。switchによるファイル操作は、1度に1行ずつ読み取りが行われパターンの評価が行われます。次の例では、PowerShellのコマンド一覧を保存したファイルから、"Get"で始まるコマンドレットの総数をカウントします。
まずはじめに、次のようにリダイレクトを使用してPowerShellコマンドレット一覧をファイルへ保存します(例8)。
PS C:\Work> Get-Command | Select-Object {$_.Name} > PSCmd.txt次にswitch文に-fileオプションを指定し、"Get"で始まるコマンドレットを$Cnt変数にカウントアップします。
switch文の例8 PS C:\Work> switch -wildcard -file c:\work\pscmd.txt >> { >> "Get*" { $Cnt++ } >> } >>最後に、"Get"で始まるコマンドレットがいくつあったかを表示してみます。
PS C:\Work> $Cnt 29今回はPowerShellにおける制御構文について、例を交えながら説明してきました。特にSwitch文においては、他の言語を圧倒する機能の多さに驚かれたのではないでしょうか?
次回は、これまでに説明してきた内容をもとに関数の作成方法について説明したいと思います。
转载于:https://www.cnblogs.com/c-x-a/p/4488103.html