8. PowerShellとフローチャート

Windows PowerSehellはDOSコマンドプロンプトの後釜として開発された次世代シェルです。

ここでは、具体的にWindows PowerSehellとフローチャートの対応関係について書きます。ソースコードとフローチャートを順番に書くことで、ソースコードの処理の流れを明確にします。

8.1. 利用方法

PowerShellはDOSコマンドプロンプトと比較して機能が強化されており、スクリプトも記述しやすくなっています。

利用する前の初期設定が少しありますすが、ここをクリアすれば後はとても記述力に優れたソースコードだと思います。

以下利用法について記載します。

8.1.1. 起動方法

PowerShell機能を使うために大きく以下の二つの起動方法があるが好きなほうを使えばよいです。

・アクセサリより起動

「Winキー」-すべてのプログラム-PowerShell-PowerShell PowerShellコマンドラインプロンプト起動

・ファイル名を指定して実行より起動

「Winキー+r」-ファイル名を指定して実行-powershellと入力して実行 PowerShellコマンドラインプロンプト起動

8.1.2. 初期設定

スクリプトファイルの拡張子は.ps1となります。

ps1ファイルは初期設定をしないと利用できません。

それを可能にするように下記の初期設定を行います。

○初期設定

「Winキー」-すべてのプログラム-アクセサリ-Windows PowerShell-Windows PowerShellを右クリックして管理者とし起動を押下」

PowerShellコマンドラインプロンプトで下記のように「Set-ExecutionPolicy RemoteSigned」と入力してEnterを押下します。

実行ポリシーの変更するかを聞かれたら、Enterを押下する。

PS C:\Windows\system32> Set-ExecutionPolicy RemoteSigned

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピックで説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):

一度設定するとレジストリに書き込まれるので次回からはこの操作は不要となります。

8.1.3. 直接スクリプトファイルを実行する方法

(1)テキストファイルを作成し拡張子を.ps1として保存。

例 sample.ps1

(2)ファイルにスクリプトを記載

sample.ps1

Write-Host "hello world"

(3)作成した.ps1ファイルを右クリック-PowerShellで実行を押下

hello world

と表示される

※Windows7 Proで確認

8.2. 三項の条件演算子

PowerShellに三項の条件演算子はないのですが、if...elseを利用して同様に記載することができます。

三項の条件演算子の構文

$変数 = if(条件) {式1} else {式2}

「条件」で利用する大小を比較する比較演算子は下記となります。

比較演算子

演算子 説明 由来
-eq 等しい(=) EQual
-ne 等しくない(<>) Not Equal
-lt より小さい(<) Less Than
-le 以下(<=) Less than or Equal
-gt より大きい(>) Greater Than
-ge 以上(>=) Greater than or Equal

三項の条件演算子の例

powershell_conditional_op.ps1

$sum = 10
$str = ""
$str = If ($sum -ge 60) { "合格" } Else { "不合格" }
Write-Host $str #「不合格」を表示

Read-Host "続行するにはEnterキーを押してください . . ." 

※「$sum -ge 60」は「$sum ≧ 60」のことです。


三項の条件演算子フローチャート

_images/sanko.gif

8.3. if...else文

if..elseの構文

if (条件式1) {
    命令文1
}
elseif (条件式2) {
    命令文2
}
else {
    命令文3
}

if..elseのフローチャート

_images/ifelse.gif

if..elseの例

powershell_if_else.ps1

比較演算子「-ge」への参照

$age = 16
$result=""
if ($age -ge 70 ){
    $result ="心の欲する所に従って矩を踰えず"
}
elseif ($age -ge 60 ){
    $result ="耳順う"
}
elseif ($age -ge 50 ){
    $result ="天命を知る"
}
elseif ($age -ge 40 ){
    $result ="惑わず"
}
elseif ($age -ge 30 ){
    $result ="立つ"
}
elseif ($age -ge 15){
    $result ="学に志す"
}
else{
    $result ="無し"
}
Write-Host $result #「学に志す」を表示

Read-Host "続行するにはEnterキーを押してください . . ." 

※「$age -ge 70」は「$age ≧ 70」のことです。


if..elseの例のフローチャート

_images/rongo.gif

8.4. switch文

switch文の構文

switch (式) {
    値1{
        命令文1
        break
    }
    値2{
        命令文2
        break
    }
    default{
        命令文3
        break
    }
}

switch文のフローチャート

_images/switch.gif

switch文の例

powershell_switch.ps1

$month = 2
$result=""
#「;」は改行の代わりに文の区切りに使える
switch($month){
    1 {$result = "January"; break}
    2 {$result = "February"; break}
    3 {$result = "March"; break}
    4 {$result = "April"; break}
    5 {$result = "May"; break}
    6 {$result = "June"; break}
    7 {$result = "July"; break}
    8 {$result = "August"; break}
    9 {$result = "September"; break}
    10 {$result = "October"; break}
    11 {$result = "November"; break}
    12 {$result = "December"; break}
    default {$result = "assert!"; break}
}
Write-Host $result #「February」を表示

Read-Host "続行するにはEnterキーを押してください . . ." 

switch文例のフローチャート

_images/switch_ex.gif

8.5. for文

for文の構文

for (初期化式; 条件式; 再初期化式) {
    命令文
}
   
初期化式 「$i=0」など、forループ内で使われる変数などの初期化を行う。
条件式 ループ処理が継続する条件を「$i -le 10」などの条件式で書かれる
再初期化式 「$i=$i+1」などのように初期化式で設定された変数を再設定するのに使われる。

for文のフローチャート

_images/for.gif

1~10の合計を求めるfor文の例

powershell_for.ps1

比較演算子「-le」への参照

$sum = 0;
for($i=1 ; $i -le 10 ; $i++){
    $sum += $i
}
Write-Host $sum #「55」と表示

Read-Host "続行するにはEnterキーを押してください . . ." 

※「$i -le 10」は「$i ≦ 10」のことです。

※「$i++」は「$i = $i + 1」のことを表します。

※「$sum += $i」は「$sum = $sum + $i」のことを表します。


for文例のフローチャート

_images/for_ex.gif

8.6. for-each文

foreachのループ文の説明

for-each文の構文

foreach (変数 in 配列・コレクション){
    Write-Host 変数
}

foreach文は配列・コレクションの数だけ、変数に配列の要素を順番に格納しながら処理をを繰り返します。


1~10の合計を求める。for-each文の例

powershell_for_each.ps1

$nums = @(1,2,3,4,5,6,7,8,9,10)
$sum = 0

foreach($num in $nums){
    $sum += $num
}
Write-Host $sum #「55」を表示

Read-Host "続行するにはEnterキーを押してください . . ." 

for-each文のフローチャート

_images/for_each.gif

8.7. while文

while文の構文

while (継続条件式) {
    命令文
}

while文のフローチャート

_images/while.gif

1~10の合計を求める。while文の例

powershell_while.ps1

$i = 1
$sum = 0
while($i -le 10){
    $sum += $i
    $i++
}
Write-Host $sum #「55」と表示

Read-Host "続行するにはEnterキーを押してください . . ." 

while文例のフローチャート

_images/while_ex.gif

8.8. do..while文

do-while文の構文

do {
    命令文
} while (継続条件式)

do-while文のフローチャート

_images/do_while.gif

1~10の合計を求める。do-while文の例

powershell_do_while.ps1

$i = 1
$sum = 0
do{
    $sum += $i
    $i++
}while($i -le 10)
Write-Host $sum #「55」と表示する。

Read-Host "続行するにはEnterキーを押してください . . ." 

do-while文のフローチャート

_images/do_while_ex.gif

8.9. continue文

continueの構文

ループ制御文{
    if(条件){continue}
    その後の処理
}

continue文はfor、while、do whileなどのループ制御文の「その後の処理」をスキップさせ、ループ処理を継続させます。


continue構文のフローチャート

_images/continue.gif

continue文の例

powershell_for_continue.ps1

$sum = 0
for ($i = 1; $i -le 10; $i++) {
    if ($i -eq 3) {
        continue
    }
    $sum += $i
}

Write-Host $sum #「52」と表示する

Read-Host "続行するにはEnterキーを押してください . . ." 

continue文のフローチャート

_images/bat_for_continue_ex.gif

8.10. break文

break文はループ制御文とswitch文を抜けだします。

breakの構文

ループ制御文{
    if(条件){break}
    その後の処理
}

break文はfor、foreeach、while、do whileのループ制御文を抜け出します。


break構文のフローチャート

_images/break.gif

break文の例

powershell_for_break.ps1

$sum = 0
for ($i = 1; $i -le 10; $i++) {
    $sum += $i
    if ($sum -ge 30) {
        break #ループを脱出する。
    }
}
Write-Host $sum #「36」と表示する。

Read-Host "続行するにはEnterキーを押してください . . ." 

break文のフローチャート

_images/bat_for_break_ex.gif

8.11. ラベル付きcontinue文

ラベル付continueの構文

:ラベル ループ制御文{
    ループ制御文{
        if(条件){continue ラベル}
        その後の処理
    }
    その後の処理1
}

「continue ラベル」文はラベル付for、foreach、while、do whileの「ループ制御文」の「その後の処理」、「ラベル付きループ制御文」の「その後の処理1」をスキップします。


continue文のフローチャート

_images/label_continue.gif

ラベル付きのものは、主に多重ループを抜ける処理をスマートの書くために使います。

C言語ではこの機能がないため、同様の処理をgoto文を使って記述することもあります。

ラベル付きcontinue文の例

powershell_for_double_continue.ps1

$sum = 0
:MYLABEL for($i = 1; $i -le 10; $i++) {
    for($j=1; $j -le 10; $j++){
        if ($i -eq 3) {
            continue MYLABEL
        }
        $sum += $i * $j
    }
}
Write-Host $sum #「2860」を表示

Read-Host "続行するにはEnterキーを押してください . . ." 

ラベル付きcontinue文のフローチャート

_images/bat_for_double_continue_ex.gif

8.12. ラベル付きbreak

ループでのラベル付breakの構文

:ラベル ループ制御文{
    ループ制御文{
        if(条件) {break ラベル}
        その後の処理
    }
    その後の処理
}

「break ラベル」文はラベル付いたfor、foreach、while、do whileの制御文のその後の処理を終了します。


ループでのラベル付きbreak文のフローチャート

_images/label_break.gif

switchでのラベル付breakの構文

:ラベル switch(変数){ # ★ラベル付きswitch★
    値a {
        switch(変数1){
            値1 {break ラベル} # ★ラベルを指定したbreak★
            default {処理;break}
        }
        その後の処理
    }
    default {処理;break}
}

「break ラベル」文はラベルの付いたswitch文の処理を終了します。


switchでのラベル付きbreak文のフローチャート

_images/switch_label_break.gif

ラベル付きのものは、主に多重ループを抜ける処理をスマートの書くために使います。

switch文で使うときにも基本的は同じで多重switch文やループを抜けるために利用する。

C言語ではこの機能がないため、同様の処理をgoto文を使って記述することになります。goto文はコーディング規約で禁止されていることが多いので、使うのが悩ましいところです。

ラベル付きbreak文の例

powershell_for_double_break.ps1

$sum = 0
:MYLABEL for($i = 1; $i -le 10; $i++) {
    for($j=1; $j -le 10; $j++){
        $sum += $i * $j
        if ($sum -ge 15) {
            break MYLABEL # :MYLABEL forのループを脱出する。
        }
    }
}
Write-Host $sum  #「15」を表示する

Read-Host "続行するにはEnterキーを押してください . . ." 

ラベル付きbreak文のフローチャート

_images/bat_for_double_break_ex.gif

ラベル付きswitchのbreak文の例

powershell_switch_label_break.ps1

$val = 10
$val1 = 1
$ret = ""
:MYLABEL switch($val){ # ★ラベル付きswitch★
    10 {
        switch($val1){
            1 {$ret = "処理0";break MYLABEL} # ★ラベルを指定したbreak★
            2 {$ret = "処理1";break}
            default {$ret = "処理2";break}
        }
        $ret =  "処理3"
        break
    }
    
    20 {
        $ret="処理4"
        break
    }
    
    default {
        $ret="処理5"
        break
    }
}

Write-Host $ret #「処理0」を表示

Read-Host "続行するにはEnterキーを押してください . . ." 

ラベル付きswitchのbreak文の例フローチャート

_images/ex_switch_label_break.gif

8.13. goto文

PowerShellにgoto文はありません。

参照:バッチ処理のgoto