3. 基本的な概念

3.1 プロバイダーとドライブ

プロバイダー を使用すると、それ以外の方法では簡単にアクセスできないデータとコンポーネントにコマンド ラインでアクセスできます。 データは、ファイル システム ドライブに似た一貫性のある形式で表示されます。

プロバイダーによって公開されるデータは ドライブ 上に表示されます。そのデータに、ディスク ドライブの場合と同様に パス を介してアクセスします。 各プロバイダーの組み込みコマンドレットでプロバイダー ドライブ上のデータを管理します。

PowerShell には、さまざまな種類のデータ ストアにアクセスするために、次の組み込みプロバイダーのセットが含まれています。

プロバイダー ドライブ名 説明 参照先
エイリアス エイリアス: PowerShell エイリアス §3.1.1
環境 Env: 環境変数 §3.1.2
FileSystem (ファイル システム) A:、B:、C: ... ディスク ドライブ、ディレクトリ、ファイル §3.1.3
機能 関数: PowerShell 関数 §3.1.4
変数 変数: PowerShell 変数 §3.1.5

Windows PowerShell:

プロバイダー ドライブ名 説明
Certificate Cert: デジタル署名用の x509 証明書
Registry HKLM: (HKEY_LOCAL_MACHINE)、HKCU: (HKEY_CURRENT_USER) Windows レジストリ
WSMan WSMan: WS-Management 構成情報

次のコマンドレットでプロバイダーとドライブを処理します。

  • Get-PSProvider: 1 つ以上のプロバイダーに関する情報を取得します
  • Get-PSDrive: 1 つ以上のドライブに関する情報を取得します

プロバイダーを表すオブジェクトの型については、§4.5.1 を参照してください。 ドライブを表すオブジェクトの型については、§4.5.2 を参照してください。

3.1.1 エイリアス

エイリアス とは、コマンドの別名です。 コマンドには複数のエイリアスを指定できます。元の名前とそのすべてのエイリアスを同じ意味で使用できます。 エイリアスは再割り当てすることができます。 エイリアスは項目 (§3.3) です。

エイリアスは別のエイリアスに割り当てることができます。ただし、新しいエイリアスは元のコマンドのエイリアスではありません。

プロバイダー Alias は、エイリアスを表すオブジェクトのみを含むフラット型名前空間です。 変数に子項目はありません。

いくつかのエイリアスが PowerShell に組み込まれています。

次のコマンドレットでエイリアスを処理します。

  • New-Alias: エイリアスを作成します
  • Set-Alias: 1 つ以上のエイリアスを作成または変更します
  • Get-Alias: 1 つ以上のエイリアスに関する情報を取得します
  • Export-Alias: 1 つ以上のエイリアスをファイルにエクスポートします

New-Alias を使用してコマンドのエイリアスを作成する場合、そのコマンドのパラメーターをそのエイリアスに含めすることはできません。 ただし、Alias: 名前空間の変数に直接代入すると、パラメーターを含めることができます。

注意

一方、必要なすべてのパラメーターを使用したそのコマンドの呼び出しを含むだけで他に何も行わない関数を作成して、その関数にエイリアスを割り当てるのは簡単なことです。

エイリアスを表すオブジェクトの型については、§4.5.4 を参照してください。

エイリアス オブジェクトは、ドライブ Alias: (§3.1) に格納されます。

3.1.2 環境変数

PowerShell 環境プロバイダーを使用すると、オペレーティング システムの環境変数を取得、追加、変更、クリア、削除できます。

プロバイダー Environment は、環境変数を表すオブジェクトのみを含むフラット型名前空間です。 変数に子項目はありません。

環境変数の名前に等号 (=) を含めることはできません。

環境変数を変更した場合、現在のセッションのみが影響を受けます。

環境変数は項目 (§3.3) です。

環境変数を表すオブジェクトの型については、§4.5.6 を参照してください。

環境変数オブジェクトは、ドライブ Env: (§3.1) に格納されます。

3.1.3 ファイル システム

PowerShell ファイル システム プロバイダーを使用すると、ディレクトリとファイルを作成し、開き、変更、削除することができます。

ファイル システム プロバイダーは、基になるファイル システムを表すオブジェクトを含む階層型名前空間です。

ファイルは、A:、B:、C: のような名前のドライブ (§3.1) に格納されます。 ディレクトリとファイルには、パス表記 (§3.4) を使用してアクセスします。

ディレクトリまたはファイルは項目 (§3.3) です。

3.1.4 関数

PowerShell 関数プロバイダーを使用すると、関数 (§8.10) とフィルター (§8.10.1) を取得、追加、変更、クリア、削除できます。

プロバイダー Function は、関数オブジェクトとフィルター オブジェクトのみを含むフラット型名前空間です。 関数にもフィルターにも子項目はありません。

関数を変更した場合、現在のセッションのみが影響を受けます。

関数は項目 (§3.3) です。

関数を表すオブジェクトの型については、§4.5.10 を参照してください。 フィルターを表すオブジェクトの型については、§4.5.11 を参照してください。

関数オブジェクトはドライブ Function: (§3.1) に格納されます。

3.1.5 変数

変数は、PowerShell 言語で直接定義および操作できます。

プロバイダー Variable は、変数を表すオブジェクトのみを含むフラット型名前空間です。 変数に子項目はありません。

次のコマンドレットでも変数を処理します。

変数は項目 (§3.3) であるため、ほとんどの Item 関連コマンドレットで操作できます。

変数を表すオブジェクトの型については、§4.5.3 を参照してください。

変数オブジェクトは、ドライブ Variable: (§3.1) に格納されます。

3.2 作業場所

現在の作業場所 は、コマンドが指す既定の場所です。 これは、コマンドの呼び出し時に明示的なパス (§3.4) が指定されていない場合に使用される場所です。 この場所には、現在のドライブ が含まれます。

PowerShell ホストには複数のドライブが存在する場合があります。その場合、ドライブごとに固有の現在の場所があります。

ディレクトリを付けずにドライブ名を指定すると、そのドライブの現在の場所が暗黙的に指定されます。

現在の作業場所をスタックに保存し、新しい場所に設定できます。 後で、その保存された場所をそのスタックから復元し、現在の作業場所にすることができます。 場所スタックには、既定の作業場所スタック と、0 個以上のユーザー定義の 名前付き作業場所スタック の 2 種類があります。 セッションが開始すると、既定の作業場所スタックは 現在の作業場所スタック にもなります。 ただし、任意の名前付き作業場所スタックを現在の作業場所スタックにすることができます。

次のコマンドレットで場所を処理します。

  • Set-Location: 現在の作業場所を確立します
  • Get-Location: 指定したドライブの現在の作業場所、または指定したスタックの作業場所を決定します
  • Push-Location: 場所のスタックを指定して一番上に現在の作業場所を保存します
  • Pop-Location: 場所のスタックを指定して一番上から現在の作業場所を復元します

作業場所と作業場所のスタックを表すオブジェクト型については、§4.5.5 を参照してください。

3.3 項目

項目 とは、エイリアス (§3.1.1)、変数 (§3.1.5)、関数 (§3.1.4)、環境変数 (§3.1.2)、ファイル システム内のファイルまたはディレクトリ (§3.1.3) のことです。

次のコマンドレットで項目を処理します。

  • New-Item: 新しい項目を作成します
  • Set-Item: 1 つ以上の項目の値を変更します
  • Get-Item: 指定した場所にある項目を取得します
  • Get-ChildItem: 指定した場所にある項目と子項目を取得します
  • Copy-Item: 1 つ以上の項目を 1 つの場所から別の場所にコピーします
  • Move-Item: 1 つ以上の項目を 1 つの場所から別の場所に移動します
  • Rename-Item: 項目の名前を変更します
  • Invoke-Item: 1 つ以上の項目に対して既定のアクションを実行します
  • Clear-Item: 1 つ以上の項目の内容を削除しますが、項目は削除しません
  • Remove-Item: 指定した項目を削除します

次のコマンドレットで項目の内容を処理します。

  • Get-Content: 項目の内容を取得します
  • Add-Content: 指定した項目にコンテンツを追加します
  • Set-Content: 項目の内容を書き込むか、置き換えます
  • Clear-Content: 項目の内容を削除します

ディレクトリを表すオブジェクトの型については、§4.5.17 を参照してください。 ファイルを表すオブジェクトの型については、§4.5.18 を参照してください。

3.4 パス名

PowerShell プロバイダーを介してアクセスできるデータ ストア内のすべての項目は、そのパス名によって一意に識別できます。 パス名 は、項目名、項目が配置されているコンテナーとサブコンテナー、コンテナーにアクセスするための PowerShell ドライブを組み合わせたものです。

パス名は、完全修飾と相対の 2 つの型に分かれています。 完全修飾パス名 は、パスを形成するすべての要素で構成されます。 次の構文は、完全修飾パス名の要素を示しています。

ヒント

構文定義での ~opt~ という表記は、その字句エンティティが構文内で省略可能であることを示します。

path:
    provider~opt~   drive~opt~   containers~opt~   item

provider:
    module~opt~   provider   ::

module:
    module-name   \

drive:
    drive-name   :

containers:
    container   \
    containers container   \

module-name は親モジュールを指します。

provider は、データ ストアにアクセスするための PowerShell プロバイダーを指します。

drive は、特定の PowerShell プロバイダーでサポートされている PowerShell ドライブを指します。

コンテナー は他のコンテナーを含むことができ、それがさらに他のコンテナーを含むことができます (以降同様)。最後のコンテナー内に 項目 が格納されます。 コンテナーは、データ ストアに存在する階層的な順序で指定する必要があります。

パス名の例を次に示します。

E:\Accounting\InvoiceSystem\Production\MasterAccount\MasterFile.dat

パスの最後の要素は、他の要素を含んでいる場合は コンテナー要素 であり、それ以外の場合は リーフ要素 です。

場合によっては、完全修飾パス名は必要ない場合があります。相対パス名で十分です。 相対パス名 は、現在の作業場所を基準にしています。 PowerShell を使用すると、現在の作業場所に対する相対的な場所を基準にして項目を識別できます。 相対パス名には、いくつかの特殊文字を使用します。 次の表では、これらの各文字について説明し、相対パス名と完全修飾パス名の例を示します。 この表の例は、C:\Windows に設定された現在の作業ディレクトリを基準にしています。

記号 説明 相対パス 完全修飾パス名
. 現在の作業場所 .\System C:\Windows\System
.. 現在の作業場所の親 ..\Program Files C:\Program Files
\ 現在の作業場所のドライブのルート \Program Files C:\Program Files
なし 特殊文字は含めません System C:\Windows\System

コマンドでパス名を使用するには、完全修飾または相対パス名としてその名前を入力します。

次のコマンドレットでパスを処理します。

  • Convert-Path: PowerShell のパスを PowerShell プロバイダーのパスに変換します
  • Join-Path: パスと子パスを 1 つのパスに結合します
  • Resolve-Path: パスに含まれるワイルドカード文字を解決します
  • Split-Path: 指定されたパス部分を返します
  • Test-Path: パスの要素が存在するかどうか、またはパスが整形式であるかどうかを確認します

一部のコマンドレット (Add-ContentCopy-Item など) では、ファイル フィルターを使用します。 ファイル フィルター は、一連のパスから選択するための条件を指定するメカニズムです。

解決されたパスを表すオブジェクト型については、§4.5.5 を参照してください。 多くの場合、パスは文字列として扱われます。

3.5 スコープ

3.5.1 概要

名前は、変数、関数、エイリアス、環境変数、またはドライブを表します。 同じ名前が、スクリプト内の異なる場所で異なる項目を示している場合があります。 名前が示す項目ごとに、その名前は、スコープ と呼ばれるスクリプト テキストの範囲内でのみ見えるようになります。 同じ名前によって示される異なる項目は、スコープが異なるか、異なる名前空間に含まれています。

スコープは入れ子にすることができます。その場合、外側のスコープは 親スコープ と呼ばれます。入れ子になったスコープは、その親の 子スコープ です。 名前のスコープは、プライベートにした場合を除き、名前が定義されているスコープとすべての子スコープです。 子スコープ内では、そこに定義されている名前によって、親スコープ内に同じ名前で定義されている項目が隠されます。

ドット ソース表記 (§3.5.5) を使用しない限り、次のそれぞれで新しいスコープが作成されます。

  • スクリプト ファイル
  • スクリプト ブロック
  • 関数またはフィルター

次の例を確認してください。

# start of script
$x = 2; $y = 3
Get-Power $x $y

#function defined in script

function Get-Power([int]$x, [int]$y)
{
if ($y -gt 0) { return $x * (Get-Power $x (--$y)) }

else { return 1 }
}
# end of script

スクリプトで作成される変数 $x$y のスコープは、そのスクリプトの本文であり、その内部に定義された関数を含みます。 関数 Get-Power には、同じ名前の 2 つのパラメーターが定義されています。 各関数は独自のスコープを持つため、これらの変数は親スコープで定義されているのとは異なる変数であり、親スコープから隠されます。 関数のスコープは、スクリプト スコープ内で入れ子になっています。

関数がそれ自体を再帰的に呼び出していることに注目してください。 そうするたびに、入れ子になった別のスコープが作成され、それぞれが独自の変数 $x$y を持ちます。

入れ子になったスコープと名前の再利用も示す、より複雑な例を次に示します。

# start of script scope
$x = 2              # top-level script-scope $x created
                    # $x is 2
F1                  # create nested scope with call to function F1
                    # $x is 2
F3                  # create nested scope with call to function F3
                    # $x is 2

function F1 {       # start of function scope
                    # $x is 2
    $x = $true      # function-scope $x created
                    # $x is $true

    & {             # create nested scope with script block
                    # $x is $true
        $x = 12.345 # scriptblock-scope $x created
                    # $x is 12.345
    }               # end of scriptblock scope, local $x goes away

                    # $x is $true
    F2              # create nested scope with call to function F2
                    # $x is $true
}                   # end of function scope, local $x goes away

function F2 {       # start of function scope
                    # $x is $true
    $x = "red"      # function-scope $x created
                    # $x is "red"
}                   # end of function scope, local $x goes away

function F3 {       # start of function scope
                    # $x is 2
    if ($x -gt 0) {
                    # $x is 2
        $x = "green"
                    # $x is "green"
    }               # end of block, but not end of any scope
                    # $x is still "green"
}                   # end of function scope, local $x goes away
# end of script scope

3.5.2 スコープの名前と番号

PowerShell では、次のスコープがサポートされています。

  • グローバル: これは最上位レベルのスコープです。 自動変数とユーザー設定変数はすべて、このスコープに定義されます。 グローバル スコープは他のすべてのスコープの親スコープであり、他のすべてのスコープはグローバル スコープの子スコープです。

  • ローカル: これは、スクリプト、スクリプト ブロック、または関数内の任意の実行ポイントの現在のスコープです。 任意のスコープをローカル スコープにすることができます。

  • スクリプト: このスコープは、実行されるスクリプト ファイルごとに存在します。 スクリプト スコープは、その内部で作成されたすべてのスコープの親スコープです。 スクリプト ブロックには独自のスクリプト スコープが存在 しません。その代わりに、最も近い先祖スクリプト ファイルのスコープがスクリプト スコープになります。 モジュール スコープというものはありませんが、スクリプト スコープはそれと同等の機能を提供します。

名前はプライベートとして宣言できます。その場合、親スコープの外部からは見えず、子スコープからも見えません。 プライベートという概念は、個別のスコープのことではありません。これは、ローカル スコープのエイリアスであり、書き込み可能な場所として使用される場合は名前を隠すことが加わります。

スコープは、あるスコープの位置を別のスコープに対して相対的に表す数字で参照できます。 スコープ 0 はローカル スコープを表し、スコープ 1 は 1 世代さかのぼった先祖スコープを表し、スコープ 2 は 2 世代さかのぼった先祖スコープを表す、というようになります。 (スコープ番号は、変数を操作するコマンドレットによって使用されます。)

3.5.3 変数名のスコープ

次の運用環境に示すように、6 つの異なるスコープのいずれかを使用して変数名を指定できます。

variable-scope:
    global:
    local:
    private:
    script:
    using:
    workflow:
    variable-namespace

スコープは省略可能です。 次の表は、考えられるすべてのコンテキストでのそれぞれの意味を示しています。 また、スコープが明示的に指定されていない場合のスコープも示しています。

スコープ修飾子 スクリプト ファイル内 スクリプト ブロック内 関数内
グローバル グローバル スコープ グローバル スコープ グローバル スコープ
script 最も近い先祖スクリプト ファイルのスコープ、またはグローバル (最も近い先祖スクリプト ファイルがない場合) 最も近い先祖スクリプト ファイルのスコープ、または、最も近い先祖スクリプト ファイルがない場合はグローバル 最も近い先祖スクリプト ファイルのスコープ、または、最も近い先祖スクリプト ファイルがない場合はグローバル
private グローバル、スクリプト、ローカルのいずれかのスコープ ローカル スコープ ローカル スコープ
local グローバル、スクリプト、ローカルのいずれかのスコープ ローカル スコープ ローカル スコープ
using 実装定義 実装定義 実装定義
workflow 実装定義 実装定義 実装定義
なし グローバル、スクリプト、ローカルのいずれかのスコープ ローカル スコープ ローカル スコープ

変数スコープの情報は、§3.1.5 に記載されているコマンドレットのファミリを使用する場合にも指定できます。 特に、詳細については、パラメーター Scope と、パラメーター Option Private および Option AllScope を参照してください。

スコープ using は、Start-JobInvoke-Command のようなコマンドレットを使用してスクリプトを実行する際、または inlinescript ステートメント 内で、別のスコープで定義された変数にアクセスするために使用されます。 次に例を示します。

$a = 42
Invoke-Command --ComputerName RemoteServer { $using:a } # returns 42
workflow foo
{
    $b = "Hello"
    inlinescript { $using:b }
}
foo # returns "Hello"

スコープ ワークフローは、ワークフローに定義されている変数にアクセスするために、parallel ステートメント または sequence ステートメント と一緒に使用します。

3.5.4 関数名のスコープ

関数名も、4 つの異なるスコープの 1 つを持つことができます。その名前の可視性は変数の場合と同じです (§3.5.3)。

3.5.5 ドット ソース表記

スクリプト ファイル、スクリプト ブロック、または関数が、別のスクリプト ファイル、スクリプト ブロック、または関数内から実行されると、実行されたスクリプト ファイルによって新しい入れ子になったスコープが作成されます。 たとえば、次のように入力します。

Script1.ps1
& "Script1.ps1"
& { ... }
FunctionA

ただし、ドット ソース表記 を使用する場合、コマンドを実行する前に新しいスコープは作成されません。そのため、独自のローカル スコープに加えた追加や変更は、代わりに現在のスコープに対して行われます。 たとえば、次のように入力します。

. Script2.ps1
. "Script2.ps1"
. { ... }
. FunctionA

3.5.6 モジュール

最上位レベルのスクリプト ファイルは階層型の入れ子になったスコープ ツリーのルートにあるのと同様に、各モジュール (§3.14) もそうなっています。 ただし、既定では、モジュールによってエクスポートされた名前だけが、インポート コンテキスト内から名前で使用できます。 Import-Module コマンドレットの Global パラメーターを使用すると、エクスポートされた名前の可視性を拡大できます。

3.6 ReadOnly および Constant プロパティ

変数とエイリアスは、多数のプロパティを含むオブジェクトによって記述されます。 これらのプロパティの設定と操作は、2 つのファミリのコマンドレット (§3.1.5§3.1.1) によって行います。 このようなプロパティの 1 つは Options です。これは、ReadOnly または Constant に設定できます (Option パラメーターを使用)。 ReadOnly とマークされた変数またはエイリアスは、削除できます。また、そのプロパティは、Force パラメーターが指定されていれば変更できます。 一方、Constant とマークされた変数またはエイリアスは削除できず、そのプロパティを変更することもできません。

3.7 メソッドのオーバーロードと呼び出しの解決

3.7.1 概要

§1 で説明したように、実行環境によって使用可能にされた (かつ PowerShell 以外の言語で記述された) 外部プロシージャは、メソッド と呼ばれます。

メソッドの名前とそのパラメーターの数と型は、そのメソッドの シグネチャ と総称されます。 (メソッドの戻り値の型はシグネチャに含まれないことに注意してください。) 実行環境では、1 つの型が同じ名前の複数のメソッドを持つことができます。ただし、それぞれシグネチャが異なる場合に限ります。 あるメソッドの複数のバージョンが定義されている場合、そのメソッドは オーバーロード されていると言います。 たとえば、Math 型 (§4.3.8) には、指定した数値の絶対値を計算する Abs というメソッドのセットが含まれていて、指定した数値は複数の型のいずれかを持つことができます。 そのセット内のメソッドは、次のシグネチャを持ちます。

Abs(decimal)
Abs(float)
Abs(double)
Abs(int)
Abs(long)
Abs(SByte)
Abs(Int16)

この場合、すべてのメソッドに同じ数の引数があります。それらのシグネチャは引数の型のみが異なります。

もう 1 つの例として Array 型 (§4.3.2) があります。これには、各配列の先頭 (既定) または指定した要素を開始位置として、ある配列から別の配列へ要素の範囲をコピーする、Copy と呼ばれるメソッドのセットが含まれます。 そのセット内のメソッドは、次のシグネチャを持ちます。

Copy(Array, Array, int)
Copy(Array, Array, long)
Copy(Array, int, Array, int, int)
Copy(Array, long, Array, long, long)

この場合、シグネチャは引数の型によって異なり、場合によっては引数番号によっても異なります。

オーバーロードされたメソッドのほとんどの呼び出しでは、渡される引数の数と型がオーバーロードの 1 つと完全に一致し、選択されるメソッドは明らかです。 ただし、そうではない場合は、オーバーロードされたどのバージョンを呼び出すか (ある場合) を解決する方法が必要です。 たとえば、次のように入力します。

[Math]::Abs([byte]10) # no overload takes type byte
[Array]::Copy($source, 3, $dest, 5L, 4) # both int and long indexes

その他の例としては、string 型 (つまり System.String) があります。これにはオーバーロードされたメソッドが多数含まれます。

PowerShell には、オーバーロードされたシグネチャと正確に一致しないメソッド呼び出しを解決するための規則が存在しますが、オーバーロードされたメソッドを定義する方法は PowerShell 自体には用意されていません。

注意

エディターの注: PowerShell 5.0 では、スクリプトベースのクラスを定義する機能が追加されました。 これらのクラスには、オーバーロードされたメソッドを含めることができます。

3.7.2 メソッドのオーバーロードの解決

メソッド呼び出し (§7.1.3) に引数式のリストと 候補メソッド (つまり、呼び出すことができるメソッド) のセットが使用されている場合、最適メソッド を選択するためのメカニズムは、オーバーロードの解決 と呼ばれます。

適用可能な候補メソッドのセット (§3.7.3) を指定すると、そのセット内の最適メソッドが選択されます。 セットに含まれるメソッドが 1 つだけの場合は、そのメソッドが最適メソッドです。 それ以外の場合、最適メソッドは、§3.7.4 に示されている規則を使用したときに、指定された引数リストに対して他のすべてのメソッドよりも適切な 1 つのメソッドです。 他のすべてのメソッドよりも適切なメソッドを厳密に 1 つに絞り込めない場合は、メソッドの呼び出しがあいまいになり、エラーが報告されます。

最適メソッドは、呼び出されるコンテキストでアクセス可能である必要があります。 たとえば、PowerShell スクリプトでプライベート メソッドまたは保護されているメソッドを呼び出すことはできません。

静的メソッドの呼び出しに最適メソッドは、静的メソッドである必要があります。また、インスタンス メソッドの呼び出しの最適メソッドは、インスタンス メソッドである必要があります。

3.7.3 適用可能メソッド

次のいずれかに該当する場合、メソッドは、引数リスト A に対して 適用可能 であると言います。

  • A の引数の数が、メソッドが受け取るパラメーターの数と同じ。
  • メソッドには M 個の必須パラメーターと N 個の省略可能なパラメーターがあり、A の引数の数は M 以上 N 未満。
  • メソッドが個数が可変の引数を受け取り、A の引数の数が、メソッドが受け入れるパラメーターの数を超えている。

適切な数の引数を指定するだけでなく、A の各引数は引数のパラメーター受け渡しモードと一致する必要があり、引数の型はパラメーターの型と一致する必要があります。そうでない場合は、引数の型からパラメーターの型への変換が必要です。

引数の型が ref (§4.3.6) の場合は、対応するパラメーターも ref である必要があります。また、変換のための引数の型は、ref 引数のプロパティ値の型です。

引数の型が ref の場合、対応するパラメーターが ref ではなく out である可能性があります。

個数が可変の引数をメソッドが受け取る場合、メソッドは 標準形式 または 拡張形式 のいずれかで適用可能です。 A の引数の数が、メソッドが受け取るパラメーターの数と同じであり、最後のパラメーターが配列である場合、形式は可能な 2 つの変換のいずれか 1 つの優先順位によって決まります。

  • A の最後の引数の型から最後のパラメーターの配列型への変換の優先順位。
  • A の最後の引数の型から最後のパラメーターの配列型の要素型への変換の優先順位。

(配列型への) 最初の変換が 2 番目の変換 (配列の要素型へ) よりも適している場合、メソッドは通常形式で適用可能です。それ以外の場合は、拡張形式で適用可能です。

パラメーターよりも多くの引数がある場合、メソッドは拡張形式でのみ適用可能です。 拡張形式で適用可能にするには、最後のパラメーターが配列型を持つ必要があります。 メソッドは、最後のパラメーターが A の一致しない各引数に対応する十分なパラメーターに置き換えられた、同等のメソッドに置き換えられます。追加される各パラメーターの型は、元のメソッドに含まれる最後のパラメーターの配列型の要素型です。 適用可能メソッドに関する上記の規則が、この新しいメソッドと引数リスト A に適用されます。

3.7.4 より適切なメソッド

引数式のセット { E~1~, E~2~, ..., E~N~ } を持つ引数リスト A と、パラメーター型 { P~1~, P~2~, ..., P~N~ }{ Q~1~, Q~2~, ..., Q~N~ } を持つ 2 つのアプリケーション メソッド M~P~ および M~Q~ が指定されている場合、M~P~変換の累積優先順位M~Q~ の優先順位を上回っていれば、M~P~ の方が M~Q~ よりも適切なメソッドとして定義されます。

変換の累積優先順位は、次のように計算されます。 各変換は、パラメーターの数に応じて異なる値に相当するものとします。E~1~ の変換は N に、E~2~ は N-1 に相当し、最後に E~N~ は 1 に相当します。 E~X~ から P~X~ への変換が E~X~ から Q~X~ への変換よりも適切な場合、M~P~ で N-X+1 が累積されます。それ以外の場合は、M~Q~ で N-X+1 が累積されます。 M~P~M~Q~ の値が同じである場合は、決着を付けるために次の規則が順番に適用されます。

  • パラメーターの型間の変換の累積優先順位 (引数の型を無視する) を、前述の優先順位と同様の方法で計算します。したがって、P~1~Q~1~ に対して、P~2~Q~2~ に対して、P~N~Q~N~ に対して、というように比較します。 引数が $null の場合、またはパラメーターの型が数値型でない場合は、比較がスキップされます。 引数の変換 E~X~ において、P~X~ に変換すると情報が失われるが、Q~X~ に変換すると情報が失われない場合、またはその逆の場合にも、比較がスキップされます。 パラメーター変換の型を比較する場合、P~X~ から Q~X~ への変換が Q~X~ から P~X~ への変換よりも適切である場合、M~P~ で N-X+1 が累積されます。それ以外の場合は、M~Q~ で N-X+1 が累積されます。 決着を付けるためのこの規則は、変換で情報が失われない場合には 最も具体的なメソッド (つまり、最小のデータ型を持つパラメーターを含むメソッド) を優先するか、変換の結果として情報が失われる場合には 最も汎用的なメソッド (つまり、最大のデータ型のパラメーターを持つメソッド) を優先することを意図しています。
  • 両方のメソッドで拡張形式を使用する場合は、より多くのパラメーターを持つメソッドが、より適切なメソッドです。
  • 一方のメソッドが拡張形式を使用し、もう一方のメソッドが標準形式を使用する場合は、標準形式を使用するメソッドが、より適切なメソッドです。

3.7.5 より適切な変換

このようにマークされた以下のテキストは、Windows PowerShell に固有です。

変換の優先順位は、低いものから高いものへの順で、次のとおりです。

  • T~1~[] から T~2~[] へ (T~1~T~2~ の間に割り当て可能な変換が存在しない)
  • T から string へ (T は任意の型)
  • T~1~ から T~2~ へ (T~1~ または T~2~ は、実装で定義された方法でカスタム変換を定義する)
  • T~1~ から T~2~ へ (T~1~ は IConvertible を実装する)
  • T~1~ から T~2~ へ (T~1~ または T~2~ はメソッド T~2~ op_Implicit(T1) を実装する)
  • T~1~ から T~2~ へ (T~1~ または T~2~ はメソッド T~2~ op_Explicit(T1) を実装する)
  • T~1~ から T~2~ へ (T~2~ は、型が T~1~ である単一の引数を受け取るコンストラクターを実装する)
  • 次のいずれかの変換:
    • string から T へ (T は静的メソッド T Parse(string) または T Parse(string, IFormatProvider) を実装する)
    • T~1~ から T~2~ へ (T~2~ は任意の列挙型、T~1~ は string または string に変換できるオブジェクトのコレクション)
  • T から PSObject へ (T が任意の型である場合)
  • 次のいずれかの変換: Language
    • T から bool へ (T は任意の数値型)
    • string から T へ (Tregexwmisearcherwmiwmiclassadsiadsisearcher、または type)
    • Tbool
    • T~1~ から Nullable[T~2~] へ (T~1~ から T~2~ への変換が存在する)
    • T から void へ
    • T~1~[] から T~2~[] へ (T~1~T~2~ の間に割り当て可能な変換が存在する)
    • T~1~ から T~2~[] へ (T~1~ はコレクション)
    • Hashtable に対して IDictionary を行います
    • ref に対して T を行います
    • xml に対して T を行います
    • delegate に対して scriptblock を行います
    • T~1~ から T~2~ へ (T~1~ は整数型で、T~2~ は列挙型)
  • $null から T へ (T は任意の値型)
  • $null から T へ (T は任意の参照型)
  • 次のいずれかの変換:
    • byte から T へ (TSByte)

    • UInt16 から T へ (TSBytebyte、または Int16)

    • Int16 から T へ (TSByte または byte)

    • UInt32 から T へ (TSBytebyteInt16UInt16、または int)

    • int から T へ (TSBytebyteInt16、または UInt16)

    • UInt64 から T へ (TSBytebyteInt16UInt16intUInt32、または long)

    • long から T へ (TSBytebyteInt16UInt16int、または UInt32)

    • float から T へ (T は任意の整数型または decimal)

    • double から T へ (T は任意の整数型または decimal)

    • decimal から T へ (T は任意の整数型)

  • 次のいずれかの変換:
    • SByte から T へ (Tbyteuint6UInt32、または UInt64)
    • Int16 から T へ (TUInt16UInt32、または UInt64)
    • int から T へ (TUInt32 または UInt64)
    • longUInt64
    • decimal から T へ (Tfloat または double)
  • 次のいずれかの変換:
    • T から string へ (T は任意の数値型)
    • T から char へ (T は任意の数値型)
    • string から T へ (T は任意の数値型)
  • 次の変換はいずれも、割り当て可能な変換と見なされます。
    • byte から T へ (TInt16UInt16intUInt32longUInt64singledouble、または decimal)
    • SByte から T へ (TInt16UInt16intUInt32longUInt64singledouble、または decimal)
    • UInt16 から T へ (TintUInt32longUInt64singledouble、または decimal)
    • Int16 から T へ (TintUInt32longUInt64singledouble、または decimal)
    • UInt32 から T へ (TlongUInt64singledouble、または decimal)
    • int から T へ (TlongUInt64singledouble、または decimal)
    • singledouble
  • T~1~ から T~2~ へ (T~2~ は基底クラスまたは T~1~ のインターフェイス)。 この変換は、割り当て可能な変換と見なされます。
  • stringchar[]
  • T から Tへ -- この変換は、割り当て可能な変換と見なされます。

T~1~ が配列ではなく他の変換が適用されない、形式 T~1~ から T~2~[] への各変換について、変換の優先順位は、T~1~ から T~2~ への変換が存在する場合、T~1~ から T~2~ への変換よりも低くなりますが、T~1~ から T~2~ への変換よりも優先順位が低いあらゆる変換よりも高くなります。

3.8 名前参照

異なる種類のコマンドが同じ名前であることはあり得ます。 このような場合に名前参照を実行する順序は、エイリアス、関数、コマンドレット、外部コマンドです。

3.9 型名の参照

§7.1.10 には、次のような文章があります。型リテラル は、何らかの指定されていない 基になる型 によって実装で表されます。 その結果、型名は、その基になる型のシノニムになります。" 型の例として、intdoublelong[]Hashtable があります。

型名は次のように照合されます: 指定した型名と、int、long、double などの組み込み 型アクセラレータ のリストを比較します。 一致が見つかった場合、それが型です。 それ以外の場合は、型名が完全修飾されていると仮定し、そのような型がホスト システムに存在するかどうかを確認します。 一致が見つかった場合、それが型です。 それ以外の場合は、名前空間プレフィックス System. を追加します。 一致が見つかった場合、それが型です。 それ以外の場合、型名はエラーになります。 このアルゴリズムは、ジェネリック型のそれぞれの型引数に適用されます。 ただし、アリティ (関数または演算子に渡される引数またはオペランドの数) を指定する必要はありません。

3.10 自動メモリ管理

さまざまな演算子やコマンドレットを使用すると、文字列や配列などの参照型オブジェクトにメモリが割り当てられます。 このメモリの割り当てと解放は、PowerShell ランタイム システムによって管理されます。 つまり、PowerShell によって自動 ガベージ コレクション が提供されます。

3.11 実行順序

副作用 は、コマンドの実行環境の状態が変化することを意味します。 変数の値の変更 (代入演算子または前置および後置インクリメントおよびデクリメント演算子を使用) は、ファイルの内容の変更と同様に副作用になります。

特に指定しない限り、ステートメントは構文の順序で実行されます。

一部の演算子で指定されている場合を除き、式に含まれる条件の評価順序と、副作用が発生する順序はどちらも未指定です。

コマンドを呼び出す式には、コマンドを指定する式と、そのコマンドに値が渡される引数を指定する 0 個以上の式が含まれます。 これらの式が相互に相対的に評価される順序は、未指定です。

3.12 エラー処理

コマンドが失敗した場合は エラー と見なされ、そのエラーに関する情報が エラー レコード に記録されます。その型は未指定ですが (§4.5.15)、この型はサブスクリプトをサポートしています。

エラーは、2 つのカテゴリのいずれかに分類されます。 操作を終了するか (強制終了になるエラー)、そうでないか (強制終了にならないエラー) です。 強制終了になるエラーが発生すると、エラーが記録され、操作が停止します。 強制終了にならないエラーが発生すると、エラーが記録され、操作が続行されます。

強制終了にならないエラーは、エラー ストリームに書き込まれます。 その情報をファイルにリダイレクトすることはできますが、エラー オブジェクトは最初に文字列に変換され、それらのオブジェクト内の重要な情報は取り込まれないため、診断は不可能ではないにしろ困難です。 代わりに、$Error1 = command 2>&1 のようにエラー テキストをリダイレクトし (§7.12)、エラー オブジェクトを変数に格納することができます。

自動変数 $Error には、最近のエラーを表すエラー レコードのコレクションが格納されます。最も直近に発生したエラーは $Error[0] にあります。 このコレクションは、新しいレコードが追加されたときに古いレコードが破棄されるように、バッファーに保持されます。 自動変数 $MaximumErrorCount は、格納できるレコードの数を制御します。

$Error には、すべてのコマンドのすべてのエラーが 1 つのコレクションにまとめて格納されます。 特定のコマンドからエラーを収集するには、共通パラメーター ErrorVariable を使用します。これにより、コレクションを保持するユーザー定義変数を指定できます。

3.13 パイプライン

パイプライン は、パイプ演算子 | (U+007C) で区切られた 1 つ以上の連続するコマンドです。 各コマンドは、先行処理から入力を受け取り、出力を後続処理に書き込みます。 パイプラインの最後の出力は、破棄されるかファイルにリダイレクトされない限り、ホスト環境に送られます。これにより、標準出力への書き込みを選択できます。 パイプライン内のコマンドは、引数から入力を受け取ることもできます。 Get-ChildItemSort-ObjectProcess-File を使用した次の例について考えてみます。それぞれ、指定のファイル システム ディレクトリにあるファイルの名前リストを作成し、テキスト レコードのセットを並べ替え、テキスト レコードに対して処理を実行するコマンドです。

Get-ChildItem
Get-ChildItem e:*.txt | Sort-Object -CaseSensitive | Process-File >results.txt

最初のケースでは、Get-ChildItem で現在または既定のディレクトリにあるファイルの名前のコレクションを作成します。 そのコレクションはホスト環境に送信され、既定では、各要素の値が標準出力に書き込まれます。

2 番目のケースでは、Get-ChildItem で引数 e:*.txt を使用して、指定したディレクトリにあるファイルの名前のコレクションを作成します。 そのコレクションはコマンド Sort-Object に書き込まれ、既定で (CaseSensitive 引数によって) 大文字と小文字を区別して昇順に並べ替えられます。 その後、結果のコレクションがコマンド Process-File に書き込まれ、何らかの (不明な) 処理が実行されます。 その後、そのコマンドからの出力がファイル results.txt にリダイレクトされます。

コマンドが単一のオブジェクトを書き込む場合、その後続処理がそのオブジェクトを受け取り、それ自体のオブジェクトを次の後続処理に書き込んだ後に終了します。 ただし、コマンドが複数のオブジェクトを書き込む場合、それらはオブジェクトごとに 1 回実行される後続処理コマンドに、一度に 1 つずつ渡されます。 この動作は、ストリーミング と呼ばれます。 ストリーム処理では、オブジェクトは、コレクション全体が生成されたときではなく、使用可能になるとすぐにパイプラインで書き込まれます。

コレクションを処理するときに、最初の要素の前と最後の要素の後に特別な処理を実行できるように、コマンドを記述できます。

3.14 モジュール

モジュール は、PowerShell コードをパーティション分割、整理、抽象化するための再利用可能な自己完結型の単位です。 モジュールには、単一の単位として使用できるコマンド (コマンドレット、関数など) と項目 (変数、エイリアスなど) を含めることができます。

モジュールを作成したら、セッションに インポート する必要があります。その後、その内部のコマンドと項目を使用できるようになります。 インポートが完了すると、コマンドと項目はローカルに定義されているかのように機能します。 モジュールは、Import-Module コマンドを使用して明示的にインポートします。 実装で定義されている方法で、モジュールを自動的にインポートすることもできます。

モジュールを表すオブジェクトの型については、§4.5.12 を参照してください。

モジュールの詳細については、§11 を参照してください。

3.15 ワイルドカード式

ワイルドカード式には、次の要素を 0 個以上含めることができます。

要素 説明
\* ? [ を除く文字 1 文字と一致します。
* 0 個以上の文字と一致します。 \* 文字に一致させるには、[*] を使用します。
? 任意の 1 文字を検索します。 ? 文字と一致させるには、 [?] を使用します。
[set]

set (空にすることはできません) の任意の 1 文字と一致します。

set が ] で始まる場合、その右角かっこは set の一部と見なされ、次の右角かっこで set が終了します。それ以外の場合、最初の右角かっこで set が終了します。

set の先頭または末尾が - である場合、そのハイフン (マイナス) は set の一部と見なされます。それ以外の場合は、ハイフン (マイナス) の両側の文字を包含範囲の区切り記号として使用した、連続する Unicode コード ポイントの範囲を示します。 たとえば、A-Z は、26 個の英語の大文字を示し、0-9 は 10 個の数字を示します。

注意

詳細については、The Open Group Base Specifications (IEEE Std 1003.1, 2004 Edition) のパターン マッチングのページを参照してください。 ただし、PowerShell の場合、エスケープ文字は円記号ではなくバッククォートです。

3.16 正規表現

正規表現には、次の要素を 0 個以上含めることができます。

要素 説明
. [ ^ * $ \ を除く文字 1 文字と一致します。
. 任意の 1 文字を検索します。 . 文字と一致させるには、 \. を使用します。
[set]
[^set]

[set] という形式は、set の任意の 1 文字に一致します。 [^set] という形式は、set のどの文字とも一致しません。 set を空にすることはできません。

set が ] または ^] で始まる場合、その右角かっこは set の一部と見なされ、次の右角かっこで set が終了します。それ以外の場合、最初の右角かっこで set が終了します。

set が - または ^- で始まるか、- で終わる場合、そのハイフン (マイナス) は set の一部と見なされます。それ以外の場合は、ハイフン (マイナス) の両側の文字を包含範囲の区切り記号として使用した、連続する Unicode コード ポイントの範囲を示します。 たとえば、A-Z は、26 個の英語の大文字を示し、0-9 は 10 個の数字を示します。

* 直前の要素の 0 個以上の繰り返しに一致します。
+ 直前の要素の 1 つ以上の繰り返しに一致します。
? 直前の要素が 0 個または 1 個あることを意味します。
^ 文字列の先頭と一致します ^ 文字に一致させるには、\^ を使用します。
$ 文字列の末尾と一致します。 $ 文字に一致させるには、$ を使用します。
\c 文字 c をエスケープし、正規表現要素として認識されないようにします。

注意

詳細については、The Open Group Base Specifications (IEEE Std 1003.1, 2004 Edition) の正規表現のページを参照してください。

Windows PowerShell: Microsoft .NET Framework の正規表現で使用できる文字クラスが次のようにサポートされています。

要素 説明
\p{name} name で指定された名前付き文字クラスの任意の文字と一致します。 サポートされている名前は、Unicode グループと、Ll、Nd、Z、IsGreek 語、IsBoxDrawing などのブロック範囲です。
\P{name} name に指定されているグループおよびブロック範囲に含まれないテキストと一致します。
\w 単語に使用される任意の文字と一致します。 Unicode 文字カテゴリ [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}] と同じです。 ECMAScript オプションで ECMAScript 準拠の動作が指定されている場合、\w は [a-zA-Z_0-9] と同等です。
\W 単語に使用される文字以外の任意の文字と一致します。 Unicode カテゴリ [\^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}] と同等です。
\s 任意の空白文字に一致します。 Unicode 文字カテゴリ [\f\n\r\t\v\x85\p{Z}] と同等です。
\S 空白以外の文字と一致します。 Unicode 文字カテゴリ [\^\f\n\r\t\v\x85\p{Z}] と同等です。
\d 10 進数字と一致します。 Unicode の場合は \p{Nd}、Unicode 以外の動作の場合は [0-9] と同等です。
\D 数字以外の任意のものと一致します。 Unicode の場合は \P{Nd}、Unicode 以外の動作の場合は [\^0-9] と同等です。

Microsoft .NET Framework の正規表現で使用できる量指定子が次のようにサポートされています。

要素 説明
* 0 個以上の一致を指定します。たとえば、\w* または (abc)*.{0,} と同等です。
+ 直前の文字の繰り返しインスタンスに一致します。
? 0 個または 1 個の一致を指定します。たとえば、\w?(abc)? のようになります。 {0,1} と同等です。
{n} 厳密に n 個の一致を指定します。たとえば、(pizza){2} のようになります。
{n,} 少なくとも n 個の一致を指定します。たとえば、(abc){2,} などです。
{n,m} n 個以上 m 個以下の一致を指定します。