PowerShellの関数を使えばコードを再利用できます。引数・戻り値・デフォルト値・パラメーター属性など、PowerShell独自の強力な関数機能を解説します。
関数の基本定義
function Get-Greeting {
param (
[string]$Name,
[string]$Greeting = "こんにちは"
)
return "$Greeting、$Name さん!"
}
# 呼び出し
Get-Greeting -Name "Taro"
Get-Greeting -Name "Hanako" -Greeting "おはよう"
# → こんにちは、Taro さん!
# → おはよう、Hanako さん!パラメーター属性で入力を制御する
function Send-Report {
[CmdletBinding()]
param (
# 必須パラメーター
[Parameter(Mandatory=$true)]
[string]$To,
# バリデーション(値の範囲チェック)
[Parameter(Mandatory=$true)]
[ValidateRange(1, 100)]
[int]$Priority,
# 値の選択肢を制限
[ValidateSet("High", "Medium", "Low")]
[string]$Level = "Medium",
# パイプラインからの入力を受け付ける
[Parameter(ValueFromPipeline=$true)]
[string]$Body
)
Write-Host "送信先: $To"
Write-Host "優先度: $Priority, レベル: $Level"
Write-Host "本文: $Body"
}戻り値とWrite-Output
function Get-DiskFreeGB {
param ([string]$Drive = "C:")
$disk = Get-PSDrive -Name $Drive.TrimEnd(":")
return [math]::Round($disk.Free / 1GB, 2)
}
$free = Get-DiskFreeGB -Drive "C:"
Write-Host "Cドライブの空き容量: ${free}GB"
# 複数の値を返す(配列として返る)
function Get-TopProcesses {
param ([int]$Count = 5)
Get-Process | Sort-Object CPU -Descending | Select-Object -First $Count
}
Get-TopProcesses -Count 3 | ForEach-Object {
Write-Host "$($_.Name): CPU=$($_.CPU)"
}スコープと変数の可視性
$globalVar = "グローバル"
function Test-Scope {
$localVar = "ローカル"
Write-Host "関数内からグローバル変数: $globalVar" # 参照できる
Write-Host "ローカル変数: $localVar"
# グローバル変数を変更したい場合
$script:globalVar = "変更後"
$global:count = 100
}
Test-Scope
Write-Host "関数外のローカル変数: $localVar" # 空になる(スコープ外)[ValidateSet]と[Parameter(Mandatory)]は、スクリプトを他の人に使ってもらうときに特に威力を発揮します。「間違った値を入力したら自動でエラーを出す」という仕組みを関数定義時に組み込めるので、使う側が間違えにくいスクリプトを作れます。
hobbyshift管理人
まとめ
- PowerShellの関数はfunctionキーワードで定義し、paramブロックで引数を宣言する
- Mandatory・ValidateSet・ValidateRangeなどの属性で入力値を自動チェックできる
- returnで値を返すか、Write-Outputで出力することで戻り値をパイプラインに渡せる
- 関数内のローカル変数は関数外から参照できない(スコープ)



コメント