Windows PowerShellにおける制御構文について学びます。数ある制御構文の中でもSwitch文は、他の言語に比べ豊富な機能が用意されています。

対象読者

  • Windows PowerShellでコマンドレット操作ができる方
  • 何らかのプログラミング経験があればなお良い

必要環境

  • Windows PowerShell

if/elseif/else

 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文を使用してカウントを表示する例です

for文の例
PS > for ( $i = 0; $i -lt 5; $i++ )
>> {
>> Write-Host ("カウント" + $i)
>> }
>>
カウント0
カウント1
カウント2
カウント3
カウント4

while

 whileは指定した条件が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

do/while

 先ほどの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
4

foreah

 foreachはコレクションに含まれるすべての項目を順番に処理します。構文は次の通りです。

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とcontinue

 breakはループ制御(foreachforwhiledo)および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
8

switch

 PowerShellにおける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"}
>> }
>>
PowerShell

ファイル処理

 PowerShellの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文においては、他の言語を圧倒する機能の多さに驚かれたのではないでしょうか?

 次回は、これまでに説明してきた内容をもとに関数の作成方法について説明したいと思います。


Windows PowerShell 入門(5)-制御構文的更多相关文章

  1. Windows PowerShell 入門(3)-スクリプト編

    これまでの記事 Windows PowerShell 入門(1)-基本操作編 Windows PowerShell 入門(2)-基本操作編 2 対象読者 Windows PowerShellでコマンド ...

  2. Windows PowerShell 入門(7)-関数編2

    この連載では.Microsoftが提供している新しいシェル.Windows Power Shellの使い方を解説します.前回に引き続きPowerShellにおける関数の取り扱いとして.変数と関数のスコ ...

  3. Windows PowerShell 入門(2)-基本操作編 2

    前回に引き続きMicrosoftが提供している新しいシェル.Windows Power Shellの基本操作方法を学びます.基本操作編第2弾の今回は.パイプの使用方法を中心としたコマンドレットの操作方 ...

  4. Windows PowerShell 入門(4)-変数と演算子

    Windows PowerShellにおける変数と演算子の使用方法について学びます.今回は代表的な演算子として.算術演算子.代入演算子.論理演算子.比較演算子.範囲演算子.置換演算子.ビット演算子.型 ...

  5. Windows PowerShell 入門(9)-エラー編

    対象読者 Windows PowerShellでコマンドレット操作ができる方 何らかのプログラミング経験があればなお良い 必要環境 Windows PowerShell エラーをリダイレクトする リダ ...

  6. Windows PowerShell 入門(6)-関数編1

    この連載では.Microsoftが提供している新しいシェル.Windows Power Shellの使い方を解説します.今回は.関数の作成基礎と引数.戻り値.Switchパラメータについて説明します. ...

  7. Windows PowerShell 入門(1)-基本操作編

    Microsoftが提供している新しいシェル.Windows Power Shellの基本操作方法を学びます.インストール.起動終了方法.コマンドレット.命名規則.エイリアス.操作方法の調べ方について ...

  8. Windows PowerShell 入門(10)-デバッグ編

    対象読者 Windows PowerShellでコマンドレット操作ができる方 何らかのプログラミング経験があればなお良い 必要環境 Windows PowerShell デバッグメッセージの出力 Po ...

  9. Windows PowerShell 入門(8)-関数編3

    この連載では.Microsoftが提供している新しいシェル.Windows PowerShellの使い方を解説します.今回は.フィルタ.スクリプトブロック.変数のスコープについて取り上げます. はじめ ...

随机推荐

  1. 在Mac OS环境下安装MySQL服务

    在Mac OS环境下安装MySQL服务 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我之前介绍过window环境下安装mysql服务,以及在Linux环境下安装mysql服务,今 ...

  2. 【JS】js将 /Date(1518943415760+0800)/ 转换为2018-2-18 16:43:35格式

    function formatDate(dt) { var year = dt.getFullYear(); var month = dt.getMonth() + 1; var date = dt. ...

  3. angular学习—组件

    组件: vue组件:xxx.vue react组件:xxx.js+xxx.css angular组件:xxx.ts+xxx.css+xxx.html angular的装饰器: @ngModule:an ...

  4. .NET获取当前程序所在电脑的CPU和内存使用率

    using System; using System.Diagnostics; using System.Text; using System.Runtime.InteropServices; nam ...

  5. HDU - 5073 Galaxy(数学)

    题目 题意:n个点,运行移动k个点到任何位置,允许多个点在同一位置上.求移动k个点后,所有点到整体中心的距离的平方和最小. 分析:这题题目真的有点迷...一开始看不懂.得知最后是选取一个中心,于是看出 ...

  6. hdu 5179 beautiful number(数位dp)

    原题链接 题意:求[l,r]中高位%低位等于0的数字个数.(不含0)分析:此题有三种方法.1.暴搜,毕竟最多才10个位.2.数位dp,预处理好整体的,再处理细节. dp[i][j]表示第i位上的数字位 ...

  7. tmux用法【常用】

    类似各种平铺式窗口管理器,tmux使用键盘操作,常用快捷键包括: Ctrl+b 激活控制台:此时以下按键生效 系统操作 ? 列出所有快捷键:按q返回 d 脱离当前会话:这样可以暂时返回Shell界面, ...

  8. mysql修改表结构语句

    mysql alter 用法,修改表,字段等信息   一: 修改表信息 1.修改表名 alter table test_a rename to sys_app; 2.修改表注释 alter table ...

  9. 细说REST API安全之认证授权

    认证授权包含2个方面:(1)访问某个资源时必须携带用户身份信息,如:用户登录时返回用户access_token,访问资源时携带该参数.(2)检查用户是否具备访问当前资源(url或数据)的权限:访问资源 ...

  10. C# "XXX.XmlSerializers”的程序集未能加载到..

    解决办法,进入Debug目录, 1.如果X86平台 sgen xxx.exe /c:"/platform:x86" 2.不考虑平台 sgen xxx.exe 3.生成前事件命令行, ...