WindowsPowerShell

PowerShellの関数を完全解説【param・Mandatory・ValidateSet・スコープの使い方】

WindowsPowerShell
記事内に広告が含まれています。

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で出力することで戻り値をパイプラインに渡せる
  • 関数内のローカル変数は関数外から参照できない(スコープ)

コメント

タイトルとURLをコピーしました