実践編:制御構文と関数・スクリプト作成
条件分岐やループ処理といった制御構文、保守性の高い高度な関数(Advanced Function)の定義、およびスクリプトファイル(.ps1)の作成と実行方法を解説します。
条件分岐(if と switch)
プログラムの処理を条件に応じて分岐させる構文について説明します。
» if / elseif / else
条件式を丸括弧 () で囲み、条件を満たしたときに実行する処理を波括弧 {} 内に記述します。
$status = 200
if ($status -eq 200) {
Write-Output "通信成功 (OK)"
} elseif ($status -eq 404) {
Write-Output "対象が見つかりません (Not Found)"
} else {
Write-Output "予期しないステータス: $status"
}
» switch
複数の値に応じて分岐させたい場合や、パターンマッチングを行いたい場合は switch を使用します。
$role = "admin"
switch ($role) {
"admin" {
Write-Output "管理者権限です"
break
}
"editor" {
Write-Output "編集者権限です"
break
}
default {
Write-Output "一般ユーザー権限です"
}
}
繰り返し構文(foreach と ForEach-Object)
コレクションの要素を順番に処理するループ構文です。PowerShell では言語構文の foreach と、パイプラインコマンドレットの ForEach-Object の使い分けが重要です。
» foreach ステートメント
メモリ上に読み込まれた配列を高速に反復処理します。
$services = "wuauserv", "bits", "spooler"
foreach ($s in $services) {
Write-Output "Target service: $s"
}
» ForEach-Object コマンドレット
パイプラインから1件ずつデータを受け取ってストリーミング処理します。全件をメモリに載せる必要がないため、巨大なデータやログを処理する際にメモリ消費を抑えられます。
Get-ChildItem -Path "./logs" -Filter "*.log" | ForEach-Object {
Write-Output "Log file: $($_.FullName), Size: $($_.Length) bytes"
}
関数の定義と高度な関数(CmdletBinding)
再利用可能な処理を関数としてまとめる方法です。
» 基本的な関数の定義
function Get-Greeting {
param (
[string]$Name = "Guest"
)
return "Hello, $Name!"
}
Get-Greeting -Name "Alice"
» 高度な関数(Advanced Functions)
先頭に [CmdletBinding()] 属性を付与することで、自作関数が標準のコマンドレットと同等の機能(-Verbose, -ErrorAction 等の共通パラメータ対応)を持つようになります。
function Backup-Configuration {
[CmdletBinding(SupportsShouldProcess = $true)]
param (
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[ValidateNotNullOrEmpty()]
[string]$SourcePath,
[Parameter(Mandatory = $true)]
[string]$DestinationPath
)
process {
if ($PSCmdlet.ShouldProcess($SourcePath, "Backup to $DestinationPath")) {
Copy-Item -Path $SourcePath -Destination $DestinationPath -Force
Write-Verbose "Backup completed successfully: $SourcePath"
}
}
}
SupportsShouldProcess = $true を宣言することで、自動的に -WhatIf や -Confirm パラメータが有効化されます。
スクリプトファイル(.ps1)の作成と実行
一連の処理を .ps1 拡張子のファイルとして保存することで、バッチ処理や自動化スクリプトとして実行できます。
» スクリプトの定義例(deploy.ps1)
# スクリプト全体で受け取る引数を定義
param (
[Parameter(Mandatory = $true)]
[string]$Environment,
[int]$Port = 8080
)
Write-Output "Starting deployment to $Environment on port $Port..."
if (-not (Test-Path -Path "./build")) {
Write-Error "Build directory does not exist."
exit 1
}
Write-Output "Deployment succeeded."
exit 0
» スクリプトの実行方法
カレントディレクトリのスクリプトを実行する際は、安全のため相対パス(./)を明示して呼び出します。
./deploy.ps1 -Environment "Production" -Port 443