Windows PowerShell 入門(5)-制御構文
Windows PowerShellにおける制御構文について学びます。数ある制御構文の中でもSwitch文は、他の言語に比べ豊富な機能が用意されています。
対象読者
- Windows PowerShellでコマンドレット操作ができる方
- 何らかのプログラミング経験があればなお良い
必要環境
- Windows PowerShell
if/elseif/else
if
文は、条件分岐をする上で欠かせない構文です。構文は次の通りです。
if (<条件>)
{
<ifの条件が満たされた場合に実行されるコードブロック>
}
elseif (<条件>)
{
<elseifの条件が満たされた場合に実行されるコードブロック>
}
else
{
<前の条件がいずれも満たされない場合に実行されるコードブロック>
}
elseif
はいくつでも記述することができますが、else
は1つまでです。どちらも省略することができます。
下記は$filesize
変数に代入されている値を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
文を使用してカウントを表示する例です
PS > for ( $i = 0; $i -lt 5; $i++ )
>> {
>> Write-Host ("カウント" + $i)
>> }
>>
カウント0
カウント1
カウント2
カウント3
カウント4
while
while
は指定した条件がtrue
の場合にループし続けます。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 (条件)
下記は変数$i
が5未満の場合実行します。
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 ($<項目> in $<コレクション>)
{
<繰り返し実行するコードブロック>
}
よく知られたコレクションの一つに配列があります。下記は配列変数$weekday
から値を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
コマンドレットはローカルコンピュータ上のサービスを取得します)。
PS > foreach ( $s in Get-Service )
>> {
>> if ($s.Status -eq "running")
>> {
>> Write-Host $s.ServiceName
>> }
>> }
>>
breakとcontinue
break
はループ制御(foreach
、for
、while
、do
)およびswitch
のコードブロック内で出現した場合、そこでそのコードブロックを終了します。
下記はfor
ループによってコードブロックが5回繰り返される例ですが、ループ内で条件が満たされた場合はループ回数が5に到達する前に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
に移動します。
よって、実行結果は偶数が表示されます。
PS > for ( $i = 0; $i -lt 10; $i++ )
>> {
>> if ( $i % 2 )
>> {
>> continue
>> }
>> Write-Host $i
>> }
>>
0
2
4
6
8
switch
PowerShellにおけるswitch
文は、他の言語同様、処理を分岐するほか、パターン照合や反復を行うことも可能です。いくつかの例と共に説明します。
まず構文は次の通りです。
switch -options (評価する式)
{
<パターン> {実行するコマンドブロック}
<パターン> {実行するコマンドブロック}
:
default {実行するコマンドブロック}
}
以下の例は$Year
を評価し、<パターン>と一致する箇所の{実行するコマンドブロック}
を処理します。$Year
には"2008"をあらかじめセットしているので、コンソールウィンドウへは"今年"と表示します(例1)。
PS > $Year = 2008
PS > switch ( $Year )
>> {
>> 2007 { Write-Host "昨年" }
>> 2008 { Write-Host "今年" }
>> 2009 { Write-Host "来年" }
>> }
>>
今年
では、一致するパターンが2つある場合がどうなるかを見てみましょう。以下は一致するパターン"2008"が2つある例です(例2)。一致するパターンが2つあるので、結果として2つのパターンの"2008"に対応する{実行するコマンドブロック}
を処理します。
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)。
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)。
PS > $Year = 2006
PS > switch ( $Year )
>> {
>> 2007 { Write-Host "昨年" }
>> 2008 { Write-Host "今年" }
>> 2009 { Write-Host "来年" }
>> default { Write-Host "一致するパターンなし" }
>> }
>>
一致するパターンなし
大文字と小文字の区別
通常、switch
文は大文字と小文字を区別しません。大文字と小文字を区別するには、-casesensitive
オプションを使用します(例5)。
PS > switch -case ("POWERSHELL")
>> {
>> "powershell" {"小文字の方に一致"}
>> "POWERSHELL" {"大文字の方に一致"}
>> default {"一致なし"}
>> }
>>
大文字の方に一致
ワイルドカードの使用
次に-wildcard
オプションの使用方法について説明します。-wildcard
オプションを使用すると、ワイルドカードによるパターン一致の評価を行うことができます。次の例は"P"で始まる文字列と"l"で終わる文字列の2種類をパターンとして指定しています(例6)。
PS > switch -wildcard ("PowerShell")
>> {
>> "P*" { Write-Host "Pで始まる"}
>> "*l" { Write-Host "lで終わる" }
>> }
>>
Pで始まる
lで終わる
正規表現の使用
-regex
オプションを使用すると、正規表現によるパターン一致の評価を行うことができます。次の例では、正規表現を利用して、文字列の先頭が"P"で始まっているパターン一致の評価を行います(例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
変数にカウントアップします。
PS C:\Work> switch -wildcard -file c:\work\pscmd.txt
>> {
>> "Get*" { $Cnt++ }
>> }
>>
最後に、"Get"で始まるコマンドレットがいくつあったかを表示してみます。
PS C:\Work> $Cnt
29
まとめ
今回はPowerShellにおける制御構文について、例を交えながら説明してきました。特にSwitch文においては、他の言語を圧倒する機能の多さに驚かれたのではないでしょうか?
次回は、これまでに説明してきた内容をもとに関数の作成方法について説明したいと思います。
Windows PowerShell 入門(5)-制御構文的更多相关文章
- Windows PowerShell 入門(3)-スクリプト編
これまでの記事 Windows PowerShell 入門(1)-基本操作編 Windows PowerShell 入門(2)-基本操作編 2 対象読者 Windows PowerShellでコマンド ...
- Windows PowerShell 入門(7)-関数編2
この連載では.Microsoftが提供している新しいシェル.Windows Power Shellの使い方を解説します.前回に引き続きPowerShellにおける関数の取り扱いとして.変数と関数のスコ ...
- Windows PowerShell 入門(2)-基本操作編 2
前回に引き続きMicrosoftが提供している新しいシェル.Windows Power Shellの基本操作方法を学びます.基本操作編第2弾の今回は.パイプの使用方法を中心としたコマンドレットの操作方 ...
- Windows PowerShell 入門(4)-変数と演算子
Windows PowerShellにおける変数と演算子の使用方法について学びます.今回は代表的な演算子として.算術演算子.代入演算子.論理演算子.比較演算子.範囲演算子.置換演算子.ビット演算子.型 ...
- Windows PowerShell 入門(9)-エラー編
対象読者 Windows PowerShellでコマンドレット操作ができる方 何らかのプログラミング経験があればなお良い 必要環境 Windows PowerShell エラーをリダイレクトする リダ ...
- Windows PowerShell 入門(6)-関数編1
この連載では.Microsoftが提供している新しいシェル.Windows Power Shellの使い方を解説します.今回は.関数の作成基礎と引数.戻り値.Switchパラメータについて説明します. ...
- Windows PowerShell 入門(1)-基本操作編
Microsoftが提供している新しいシェル.Windows Power Shellの基本操作方法を学びます.インストール.起動終了方法.コマンドレット.命名規則.エイリアス.操作方法の調べ方について ...
- Windows PowerShell 入門(10)-デバッグ編
対象読者 Windows PowerShellでコマンドレット操作ができる方 何らかのプログラミング経験があればなお良い 必要環境 Windows PowerShell デバッグメッセージの出力 Po ...
- Windows PowerShell 入門(8)-関数編3
この連載では.Microsoftが提供している新しいシェル.Windows PowerShellの使い方を解説します.今回は.フィルタ.スクリプトブロック.変数のスコープについて取り上げます. はじめ ...
随机推荐
- Event Recommendation Engine Challenge分步解析第一步
一.简介 此项目来自kaggle:https://www.kaggle.com/c/event-recommendation-engine-challenge/ 数据集的下载需要账号,并且需要手机验证 ...
- python html css 初识
##################总结############ 浏览器发请求 --> HTTP协议 --> 服务端接收请求 --> 服务端返回响应 --> 服务端把HTML文 ...
- Java实现OPC通信
1.PLC和OPC 使用的PLC:西门子的S7 300,具体型号如下图 使用的OPC server软件: 模拟仿真用的 MatrikonOPCSimulation(50M),百度网盘,密码: mcur ...
- DirectX11 With Windows SDK--02 顶点/像素着色器的创建、顶点缓冲区
前言 由于在Direct3D 11中取消了固定管线,要想绘制图形必须要了解可编程渲染管线的流程,一个能绘制出图形的渲染管线最少需要有这两个可编程着色器:顶点着色器和像素着色器. 本章会直接跳过渲染管线 ...
- Nullable<DateTime> DateTime? 格式转换问题 tostring()
解决方案: DateTime? dt2 = DateTime.Now; dt2.GetValueOrDefault().ToString("yyyy-MM-dd"); 控制器代码: ...
- SQL的六种约束
https://blog.csdn.net/z120270662/article/details/79501621
- TCP时间获取程序
一.服务器程序 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <sys/ ...
- systemctl命令详解
一.查询服务是否开机启动 systemctl is-enabled xxx.service 二.开机运行服务 systemctl enable xxx.service 三.取消开机运行 s ...
- [译]A NON-TRIVIAL EXAMPLE OF MEDIATR USAGE
原文 来看看我目前的一个项目.这个是一个多租户的财务跟踪系统.有一个组织继承的关系.首先得新建一个组织. 表单如下: 这个表单能让用户输入关于组织的一些信息,包括active directory组,一 ...
- 初入爬虫(java)
public class CrawlerUtil { public static void main(String [] args) throws IOException { // 创建默认的http ...