3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Powershell角括弧まとめ

3
Posted at

はじめに(結論)

PowerShell の [] は、見た目が同じでも文脈によって役割が変わる記法です。型まわりに限定すると意味は次の5種類に整理できます。

  • 型リテラル
  • 型注釈
  • キャスト
  • 静的メンバー参照
  • 属性(Attribute)

要点は次の通りです。

  • [] 自体に意味はなく、後ろに何を書くか・どこに置くかで意味が決まる
  • 型リテラルが基礎で、他はその派生用途
  • 属性だけは「実行される処理」ではなく、エンジンに解釈されるメタ情報

背景

PowerShell では次のように、すべて [] を含む記法が混在するため混乱しがちです。

[int]$x = "123"      # 型注釈(代入時に暗黙キャスト)
$x = [int]"123"      # キャスト(即時変換)
[int]::MaxValue       # 静的メンバー参照
[ValidateSet('Dev','Prod')] # 属性

同じ [] でも文脈により意味が異なるのが混乱の原因です。

1. 型リテラル(Type Literal)

何か:[int][System.DateTime] のように「型そのもの」を値として表す記法。
   型アクセラレータとも呼び、.NETクラスの長い型名をエイリアスで表現できる。

  • 形: [型]
  • 例: [int], [string], [System.IO.FileInfo]

何に使う?

  • 静的メンバー参照のレシーバー
  • 型情報の取得(例: [int].FullName
  • ジェネリック型の土台(例: [System.Collections.Generic.List[int]]

ポイント:型リテラル単体では処理は起きず、型オブジェクトを指すだけです。

[int].FullName
# 出力: System.Int32

2. 型注釈(Type Annotation)

何か:変数・パラメータ・戻り値に「この型として扱え」という制約をかける。

  • 形: [型]$変数

例(変数・パラメータ):

[int]$x = 10

function Test {
  param(
    [string]$Name,
    [int]$Age
  )
}

挙動の本質:代入時・呼び出し時に「暗黙キャスト」が走り、変換できなければエラー。

[int]$x = "123"  # OK(文字列→int に暗黙変換)
[int]$x = "abc"  # 失敗(変換不可)

まとめ:型注釈 = 制約 + 暗黙キャスト。

3. キャスト(Type Cast)

何か:値を明示的に指定した型へ変換する。

  • 形: [型] 値

例:

[int]"123"
[datetime]"2026-02-04"
[bool]"true"

特徴:

  • 即時評価され、失敗すると例外になる
  • 型注釈より「明示的に変換したい」意図がはっきりする
$x = [int]"123"

型注釈との違い(重要):

観点 型注釈 キャスト
タイミング 代入・呼び出し時 即時
目的 制約(+暗黙変換) 変換
書き方 [int]$x $x = [int]"123"

4. 静的メンバー参照(Static Member Access)

何か:型が持つ静的プロパティ/メソッドを呼ぶ。

  • 形: [型]::メンバー

例:

[math]::Sqrt(16)
[datetime]::Now
[System.Guid]::NewGuid()

本質:インスタンス不要。ここでの [] は「型リテラル」として使われています。

# インスタンス不要(静的プロパティ)
[datetime]::Today

# インスタンスが必要な場合(インスタンス メソッド)
(Get-Date).AddDays(1)

メモ::: が使えるのは「型リテラル」の後だけです。

5. 属性(Attribute)

何か:関数・パラメータ・クラス等にメタ情報(振る舞い・制約)を付与する。

  • 形: [属性名(引数)]

例1(関数):

function Get-Sample {
  [CmdletBinding()]
  param()
}

例2(パラメータ):

param(
  [Parameter(Mandatory)]
  [ValidateSet('Dev','Prod')]
  [string]$Env
)

特徴:

  • 実行されるコードではなく、PowerShell エンジンに解釈されるメタ情報
  • 複数個を縦に積める
  • 属性も内部的には .NET の型
[Parameter(Mandatory)]
[ValidateRange(1,10)]
[int]$Count

5つの関係性を一発で整理

[型]            ← 型リテラル(型そのもの)
 │
 ├─ [型]$x      ← 型注釈(制約)
 ├─ [型] 値     ← キャスト(変換)
 ├─ [型]::X     ← 静的メンバー参照
 └─ [属性()]    ← メタ情報付与

混乱しやすいポイント(重要)

  • 同じ [] でも意味は文脈依存
[int]$x          # 型注釈
$x = [int]"1"    # キャスト
[int]::MaxValue  # 静的メンバー参照
  • 属性は「関数呼び出し」ではない(エンジンが解釈するメタ情報)
[ValidateSet('Dev','Prod')]  # これはメソッド呼び出しではない

まとめ

[] の正体は「型リテラル」または「属性の開始記号」であり、置き場所と後続の記法で意味が決まります。型リテラルを基礎に、型注釈(制約+暗黙変換)、キャスト(即時変換)、静的メンバー参照(::)の4つを使い分け、属性は実行コードではない点を意識しておくと混乱が減ります。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?