Windowsのシステム管理や自動化作業において、PowerShellは非常に強力なツールとして広く活用されています。
効率的かつ再利用性の高いスクリプトを作成するためには、データの「入れ物」である変数を正しく扱うスキルが不可欠です。
本記事では、PowerShellにおける変数の宣言方法や代入の基本ルールから、実務で役立つデータ型の指定、変数の有効範囲であるスコープの概念までを詳しく解説します。
初心者の方はもちろん、スクリプトの品質をさらに高めたい中級者の方にとっても役立つ情報を網羅していますので、ぜひ参考にしてください。
PowerShellにおける変数の基礎知識
PowerShellの変数は、データを一時的にメモリへ保存し、後から呼び出して利用するための識別子です。
他のプログラミング言語と同様に、変数を使用することでコードの可読性が高まり、複雑な処理を簡潔に記述できるようになります。
変数の命名規則と基本形式
PowerShellの変数は、必ず「$(ドル記号)」から始まるという特徴があります。
例えば、$messageや$countといった形式で記述します。
変数名には、英数字とアンダースコア(_)を使用するのが一般的です。
また、PowerShellは変数名の大文字と小文字を区別しないという性質を持っています。
そのため、$MyVariableと$myvariableは同じ変数として扱われる点に注意が必要です。
特殊な文字を含む変数名
基本的には英数字を用いるのが推奨されますが、特殊な文字やスペースを変数名に含めることも可能です。
その場合は、変数名を「${ }」で囲む必要があります。
# 特殊な文字を含む変数名の例
${Variable Name with Space} = "Special Name"
Write-Host ${Variable Name with Space}
Special Name
しかし、コードの可読性が著しく低下するため、特別な理由がない限りは標準的な命名規則に従うのが無難です。
変数の宣言と代入の基本操作
PowerShellでは、変数の宣言と値の代入を同時に行うのが最も一般的な方法です。
事前の宣言を必要とせず、値を代入した瞬間に変数が生成されます。
基本的な代入の書き方
値を代入するには、代入演算子である=を使用します。
左辺に変数を記述し、右辺に代入したい値を記述するだけのシンプルな構造です。
# 数値の代入
$number = 100
# 文字列の代入
$text = "こんにちは、PowerShell"
# 変数の内容を表示
$number
$text
100
こんにちは、PowerShell
複数の変数への一括代入
PowerShellでは、複数の変数に対して同じ値を一度に代入したり、異なる値を一括で代入したりする便利な機能があります。
複数の変数に同じ値を代入する場合は、以下のように記述します。
# 同一値の一括代入
$a = $b = $c = 0
Write-Host "a:$a, b:$b, c:$c"
a:0, b:0, c:0
また、カンマ区切りを利用して、複数の変数に個別の値を割り当てることも可能です。
# 個別値の一括代入
$x, $y, $z = 1, 2, 3
Write-Host "x:$x, y:$y, z:$z"
x:1, y:2, z:3
コマンドの実行結果を代入する
変数には、静的な値だけでなく、コマンド(コマンドレット)の実行結果をそのまま代入できます。
これは自動化スクリプトにおいて非常に多用されるテクニックです。
# 現在の時刻を変数に代入
$currentDate = Get-Date
# サービスの一覧を変数に代入
$services = Get-Service
# 結果の一部を表示
$currentDate.Year
2026
データ型の指定(型ヒント)
PowerShellは「動的型付け」の言語であるため、通常は自動的にデータ型が判別されます。
しかし、明示的に型を指定することで、意図しない値の混入を防ぎ、スクリプトの信頼性を高めることができます。
型を指定するメリット
型を固定することで、例えば数値が入るべき変数に誤って文字列が代入されるといったミスを未然に防げます。
これを「厳密な型指定」と呼びます。
主なデータ型の一覧
PowerShellでよく利用される主なデータ型を以下の表にまとめました。
| 型指定子 | データ型の説明 |
|---|---|
[string] | 文字列(テキストデータ) |
[int] | 32ビット符号付き整数 |
[long] | 64ビット符号付き整数 |
[double] | 倍精度浮動小数点数(小数) |
[bool] | 真偽値(True または False) |
[array] | 配列(複数のデータの集合) |
[hashtable] | 連想配列(キーと値のペア) |
[datetime] | 日付と時刻 |
型指定を用いた宣言の具体例
型を指定して変数を宣言する場合は、変数名の前に[型名]を記述します。
# 整数型を明示
[int]$age = 25
# 文字列型を明示
[string]$userName = "Taro"
# 型と異なる値を代入しようとするとエラーが発生、もしくは自動変換される
$age = "30" # これは数値に変換可能なので成功する
# $age = "abc" # これはエラーになる
特にWeb APIから取得したデータや、ユーザーからの入力を処理する際には、明示的な型指定が役立ちます。
変数のスコープ(有効範囲)
変数がスクリプトの「どこから見えるか」を決定するのがスコープです。
PowerShellには主に4つのスコープが存在し、これらを理解していないと思わぬバグの原因となります。
4つの主要なスコープ
- Global(グローバル): PowerShellセッション全体で有効です。セッションを閉じるまで保持されます。
- Local(ローカル): 現在のスコープ(関数内やスクリプト内)のみで有効です。
- Script(スクリプト): 実行中のスクリプトファイル内全体で有効です。
- Private(プライベート): 現在のスコープのみで有効で、子スコープからは参照できません。
スコープ修飾子による指定
変数名の前に修飾子を付けることで、特定のスコープに属する変数を定義できます。
# グローバルスコープでの宣言
$global:adminUser = "Administrator"
# スクリプトスコープでの宣言
$script:configPath = "C:\temp\config.json"
修飾子を指定せずに宣言した場合、通常はその場所の「ローカルスコープ」として扱われます。
関数とスコープの関係
関数内で宣言された変数は、既定でその関数内のみ有効です。
関数の外にある変数を関数内で書き換える場合は、スコープを意識した記述が必要になります。
# 外側の変数
$counter = 10
function Test-Scope {
# ローカル変数として扱われる(外側には影響しない)
$counter = 20
Write-Host "関数内: $counter"
}
Test-Scope
Write-Host "関数外: $counter"
関数内: 20
関数外: 10
外側の変数を書き換えたい場合は、「$script:変数名」のように明示してアクセスする必要があります。
特殊な変数とシステム変数
PowerShellには、ユーザーが定義しなくても最初から用意されている特別な変数が存在します。
自動変数
自動変数は、PowerShellの状態や直前の実行結果を保持するためにシステムが管理する変数です。
これらはユーザーが値を直接代入することはできませんが、スクリプト作成時に頻繁に参照します。
$_(または$PSItem):パイプラインを流れる現在のオブジェクトを指します。$?:直前のコマンドが成功したかどうか(True/False)を保持します。$Error:発生したエラーの履歴が格納される配列です。$null:値が存在しないことを示す「空」の状態を表します。
環境変数
OSの環境変数にアクセスするには、$env:というプレフィックスを使用します。
# コンピュータ名を表示
$env:COMPUTERNAME
# テンポラリフォルダのパスを表示
$env:TEMP
MY-PC-NAME
C:\Users\Admin\AppData\Local\Temp
定数と読み取り専用変数の作成
一度代入した値を後から変更したくない場合には、Set-Variableコマンドレットを使用して「定数」や「読み取り専用変数」を作成できます。
読み取り専用変数の宣言
読み取り専用変数は、通常の方法では変更できませんが、オプションを付ければ削除や上書きが可能です。
# 読み取り専用変数の作成
Set-Variable -Name "ReadOnlyVar" -Value "変更不可" -Option ReadOnly
# 変更しようとするとエラーが発生する
# $ReadOnlyVar = "変更してみる"
定数の宣言
定数は、セッションが終了するまで「絶対に値を変更・削除できない」変数です。
設定値など、スクリプトの実行中に変わることがあってはならない重要なデータに適しています。
# 定数の作成
Set-Variable -Name "PI" -Value 3.14159 -Option Constant
# 削除も変更もできません
変数を活用した実践的なテクニック
変数の基本を抑えたところで、実務で役立つ応用的なテクニックをいくつか紹介します。
ヒアドキュメントによる複数行テキストの代入
長いメッセージや設定ファイルをスクリプト内に記述する場合、ヒアドキュメントを使用すると便利です。
@" ... "@の形式で記述します。
$mailBody = @"
拝啓
システム管理者様
バックアップ処理が正常に完了しました。
ご確認をお願いします。
"@
Write-Host $mailBody
変数展開(ダブルクォートとシングルクォートの違い)
文字列の中で変数を使用する場合、引用符の使い分けが重要になります。
ダブルクォート(”)で囲むと、文字列の中にある変数がその値に展開されます。
一方、シングルクォート(’)で囲むと、変数は展開されずそのままの文字として扱われます。
$name = "PowerShell"
Write-Host "こんにちは、$name" # 変数が展開される
Write-Host 'こんにちは、$name' # 文字として表示される
こんにちは、PowerShell
こんにちは、$name
まとめ
本記事では、PowerShellにおける変数の宣言、代入、データ型の指定、そしてスコープの仕組みについて網羅的に解説しました。
変数は単なるデータの保存場所ではなく、適切に型を指定し、スコープを管理することで、コードの堅牢性を大きく左右する重要な要素です。
特に$env:による環境変数の利用や、自動変数$_の活用は、効率的な自動化スクリプトを書く上で避けては通れません。
まずは基本の代入操作から慣れていき、徐々に型指定やスコープを意識した高度なスクリプティングに挑戦してみてください。
正しく変数を使いこなすことで、あなたのPowerShellライフがより快適で生産的なものになることを願っています。
