8. PowerShellとフローチャート¶
Windows PowerSehellはDOSコマンドプロンプトの後釜として開発された次世代シェルです。
ここでは、具体的にWindows PowerSehellとフローチャートの対応関係について書きます。ソースコードとフローチャートを順番に書くことで、ソースコードの処理の流れを明確にします。
Contents
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」のことです。
三項の条件演算子フローチャート
8.3. if...else文¶
if..elseの構文
if (条件式1) {
命令文1
}
elseif (条件式2) {
命令文2
}
else {
命令文3
}
if..elseのフローチャート
if..elseの例
powershell_if_else.ps1
$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の例のフローチャート
8.4. switch文¶
switch文の構文
switch (式) {
値1{
命令文1
break
}
値2{
命令文2
break
}
default{
命令文3
break
}
}
switch文のフローチャート
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文例のフローチャート
8.5. for文¶
for文の構文
for (初期化式; 条件式; 再初期化式) {
命令文
}
初期化式 | 「$i=0」など、forループ内で使われる変数などの初期化を行う。 |
条件式 | ループ処理が継続する条件を「$i -le 10」などの条件式で書かれる |
再初期化式 | 「$i=$i+1」などのように初期化式で設定された変数を再設定するのに使われる。 |
for文のフローチャート
1~10の合計を求めるfor文の例
powershell_for.ps1
$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文例のフローチャート
8.6. for-each文¶
foreachのループ文の説明
for-each文の構文
foreach (変数 in 配列・コレクション){
Write-Host 変数
}
foreach文は配列・コレクションの数だけ、変数に配列の要素を順番に格納しながら処理をを繰り返します。
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文のフローチャート
8.7. while文¶
while文の構文
while (継続条件式) {
命令文
}
while文のフローチャート
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文例のフローチャート
8.8. do..while文¶
do-while文の構文
do {
命令文
} while (継続条件式)
do-while文のフローチャート
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文のフローチャート
8.9. continue文¶
continueの構文
ループ制御文{
if(条件){continue}
その後の処理
}
continue文はfor、while、do whileなどのループ制御文の「その後の処理」をスキップさせ、ループ処理を継続させます。
continue構文のフローチャート
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文のフローチャート
8.10. break文¶
break文はループ制御文とswitch文を抜けだします。
breakの構文
ループ制御文{
if(条件){break}
その後の処理
}
break文はfor、foreeach、while、do whileのループ制御文を抜け出します。
break構文のフローチャート
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文のフローチャート
8.11. ラベル付きcontinue文¶
ラベル付continueの構文
:ラベル ループ制御文{
ループ制御文{
if(条件){continue ラベル}
その後の処理
}
その後の処理1
}
「continue ラベル」文はラベル付for、foreach、while、do whileの「ループ制御文」の「その後の処理」、「ラベル付きループ制御文」の「その後の処理1」をスキップします。
continue文のフローチャート
ラベル付きのものは、主に多重ループを抜ける処理をスマートの書くために使います。
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文のフローチャート
8.12. ラベル付きbreak¶
ループでのラベル付breakの構文
:ラベル ループ制御文{
ループ制御文{
if(条件) {break ラベル}
その後の処理
}
その後の処理
}
「break ラベル」文はラベル付いたfor、foreach、while、do whileの制御文のその後の処理を終了します。
ループでのラベル付きbreak文のフローチャート
switchでのラベル付breakの構文
:ラベル switch(変数){ # ★ラベル付きswitch★
値a {
switch(変数1){
値1 {break ラベル} # ★ラベルを指定したbreak★
default {処理;break}
}
その後の処理
}
default {処理;break}
}
「break ラベル」文はラベルの付いたswitch文の処理を終了します。
switchでのラベル付きbreak文のフローチャート
ラベル付きのものは、主に多重ループを抜ける処理をスマートの書くために使います。
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文のフローチャート
ラベル付き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文の例フローチャート