次の方法で共有


3. 基本的な概念

編集メモ

重要

Windows PowerShell 言語仕様 3.0 は、2012 年 12 月に公開され、Windows PowerShell 3.0 に基づいています。 この仕様では、PowerShell の現在の状態は反映されません。 現在の状態を反映するようにこのドキュメントを更新する予定はありません。 このドキュメントは、履歴参照のためにここに示されています。

仕様文書は、Microsoft ダウンロード センターから Microsoft Word 文書として入手できます。https://www.microsoft.com/download/details.aspx?id=36389 Word 文書は、Microsoft Learn でプレゼンテーション用に変換されています。 変換中に、Docs プラットフォームの書式設定に対応するために、いくつかの編集の変更が行われました。 一部の入力ミスと軽微なエラーが修正されました。

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

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

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

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

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

Windows PowerShell:

プロバイダー ドライブ名 説明
証書 証明 書: デジタル署名用の x509 証明書
レジストリ 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) です。

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

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

PowerShell には、一連の組み込みエイリアスが付属しています。

次のコマンドレットはエイリアスを扱います。

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

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

手記

ただし、必要なすべてのパラメーターを持つそのコマンドの呼び出しを含むだけの関数を作成し、その関数にエイリアスを割り当てるのは簡単な問題です。

エイリアスを表すオブジェクトの型については、§4.5.4で説明されています。

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

3.1.2 環境変数

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

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

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

環境変数に対する変更は、現在のセッションにのみ影響します。

環境変数は項目 (§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) を取得、追加、変更、クリア、および削除できます。

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

関数に対する変更は、現在のセッションにのみ影響します。

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

関数を表すオブジェクトの型については、§4.5.10で説明されています。 フィルターを表すオブジェクトの型については、§4.5.11で説明されています。

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

3.1.5 変数

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

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

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

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

変数を表すオブジェクトの型については、§4.5.3で説明されています。

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

3.2 作業場所

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

PowerShell ホストには複数のドライブがある場合があります。その場合、各ドライブには独自の現在の場所があります。

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

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

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

  • 場所の設定: 現在の作業場所を確立します
  • 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: 新しい項目を作成します。
  • 項目セット: 1 つ以上の項目の値を変更します
  • Get-Item: 指定した場所にある項目を取得します。
  • Get-ChildItem: 指定した場所にある項目と子項目を取得します。
  • Copy-Item: 1 つまたは複数のアイテムを 1 つの場所から別の場所にコピーします
  • 項目移動: 1 つまたは複数の項目を 1 つの場所から別の場所に移動します
  • Rename-Item: アイテムの名前を変更します
  • 項目呼び出し: 1 つ以上の項目に対して既定のアクションを実行します
  • 項目クリア: 1 つ以上の項目の内容を削除しますが、アイテムは削除しません (「」を参照)
  • Remove-Item: 指定したアイテムを削除します

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

ディレクトリを表すオブジェクトの型については、§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   \

モジュール名 は親モジュールを参照します。

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

ドライブ は、特定の 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 つのパスに結合します
  • 解決パスの: パス内のワイルドカード文字を解決します
  • 分割パス: パスの指定した部分を返します。
  • 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

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

スコープ修飾子 スクリプト ファイル内 スクリプト ブロック内 関数内
グローバル グローバル スコープ グローバル スコープ グローバル スコープ
スクリプト 最も近い先祖スクリプト ファイルのスコープまたは最も近い先祖スクリプト ファイルがない場合はグローバル 最も近い先祖スクリプト ファイルのスコープまたは最も近い先祖スクリプト ファイルがない場合はグローバル 最も近い先祖スクリプト ファイルのスコープまたは最も近い先祖スクリプト ファイルがない場合はグローバル
非公開 グローバル/スクリプト/ローカル スコープ ローカル スコープ ローカル スコープ
local グローバル/スクリプト/ローカル スコープ ローカル スコープ ローカル スコープ
using 実装の定義 実装の定義 実装の定義
ワークフロー 実装の定義 実装の定義 実装の定義
何一つ グローバル/スクリプト/ローカル スコープ ローカル スコープ ローカル スコープ

変数スコープ情報は、(§3.1.5) に記載されているコマンドレットファミリを使用する場合にも指定できます。 具体的には、パラメーター Scope、およびパラメーターの Option PrivateOption 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"

スコープ ワークフローは、ワークフローで定義されている変数にアクセスするために、並列ステートメント または sequence-statement と共に使用されます。

3.5.4 関数名のスコープ

関数名には、4 つの異なるスコープのいずれかを含めることもできます。その名前の可視性は変数の場合と同じです (§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 リードオンリープロパティと定数プロパティ

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

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

3.7.1 概要

§1 で述べたように、実行環境で使用できる外部プロシージャ (および PowerShell 以外の言語で記述) は、メソッドと呼ばれます。

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

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

この場合、すべてのメソッドは同じ数の引数を持っています。シグネチャは引数の型によってのみ異なります。

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

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

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

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

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

その他の例としては、文字列 型 (つまり、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 引数の Value プロパティの型になります。

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

メソッドが可変数の引数を受け取る場合、メソッドは通常の形式 、または展開されたフォーム適用できます。 A の引数の数が、メソッドが受け入れるパラメーターの数と同じで、最後のパラメーターが配列である場合、フォームは、次の 2 つの変換のうちの 1 つのランクに依存します。

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

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

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

3.7.4 より良い方法

引数リスト A に 一連の引数式と、パラメーター型が および の 2 つのアプリケーション メソッドがある場合、 は、 の 変換の 累積ランク付けが よりも優れている場合、 よりも優れたメソッドとして定義されます。

変換の累積順位は、次のように計算されます。 各変換は、パラメーターの数に応じて異なる価値があり、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~Q~2~、...、および Q~N~に対する P~N~P~2~ と比較されます。 引数が $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 を累積します。 このタイブレークルールは、変換で情報が失われない場合に 最も具体的なメソッド (つまり、最小のデータ型を持つメソッド) を好むか、変換によって情報が失われる場合に最も一般的なメソッド (つまり、最大のデータ型のパラメーターを持つメソッド) を優先することを目的としています。
  • 両方のメソッドが展開されたフォームを使用する場合は、より多くのパラメーターを持つメソッドが適しています。
  • 1 つのメソッドが展開フォームを使用し、もう一方が通常のフォームを使用する場合は、通常のフォームを使用する方法が適しています。

3.7.5 変換の改善

次のようにマークされているテキストは、Windows PowerShell に固有です。

変換は、次の方法でランク付けされます。最下位から最高順にランク付けされます。

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

    • 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)

    • T が任意の整数型または decimal である場合、double から T へ移行します。

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

  • 次のいずれかの変換。
    • SByte から T へ (Tbyteuint6UInt32、または UInt64)
    • Int16 から T へ (TUInt16UInt32、または UInt64)
    • TUInt32 または UInt64 である場所で int から T
    • long から UInt64
    • decimal から T へ (Tfloat または double)
  • 次のいずれかの変換。
    • T から string において、T が任意の数値型である場合
    • T から char へ (T は任意の数値型)
    • T が任意の数値型であるとして、string から 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)
    • single から double
  • T~1~の基底クラスまたはインターフェイスである T~2~ において、T~1~ から T~2~ へ。 この変換は、割り当て可能な変換と見なされます。
  • string から char[] まで
  • 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 つのカテゴリのいずれかに分類されます。 操作を終了するか (終了エラー)、終了しない (非終了エラー)。 終了エラーが発生すると、エラーが記録され、操作が停止します。 終了しないエラーが発生すると、エラーが記録され、操作が続行されます。

終了しないエラーは、エラー ストリームに書き込まれます。 その情報はファイルにリダイレクトできますが、エラー オブジェクトは最初に文字列に変換され、それらのオブジェクト内の重要な情報はキャプチャされず、不可能でない場合は診断が困難になります。 代わりに、エラー テキストをリダイレクト (§7.12) と、のように変数に保存されたエラー オブジェクトを指定できます。

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

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

パイプライン

パイプライン は、パイプ演算子 | (U+007C) で区切られた 1 つ以上のコマンドのシリーズです。 各コマンドは、先行タスクから入力を受け取り、後続コマンドに出力を書き込みます。 パイプラインの最後の出力が破棄されるか、ファイルにリダイレクトされない限り、ホスト環境に送信されます。ホスト環境では、標準出力への書き込みを選択できます。 パイプライン内のコマンドは、引数から入力を受け取る場合もあります。 たとえば、特定のファイル システム ディレクトリにファイル名の一覧を作成し、一連のテキスト レコードを並べ替え、テキスト レコードに対してそれぞれ処理を実行するコマンド Get-ChildItemSort-Object、および Process-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 つずつ配信され、オブジェクトごとに 1 回実行されます。 この動作は ストリーミングと呼ばれます。 ストリーム処理では、オブジェクトは、コレクション全体が生成されたときではなく、使用可能になるとすぐにパイプラインに沿って書き込まれます。

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

3.14 モジュール

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

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

モジュールを表すオブジェクトの型については、§4.5.12で説明されています。

モジュールについては、§11 で詳しく説明します。

3.15 ワイルドカード表現

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

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

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

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

設定 が - で始まるか終わる場合、そのハイフンマイナスは セットの一部と見なされます。それ以外の場合は、連続する Unicode コードポイントの範囲を示し、ハイフンマイナスの両側の文字がその範囲の包括的境界を示します。 たとえば、A から Z は 26 文字の英大文字を示し、0 から 9 は 10 桁の 10 桁の数字を示します。

手記

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

3.16 正規表現

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

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

[セット] フォームは、セットの任意の 1 文字と一致します。 [^セット] 形式は、セットの文字と一致しません。 set を空にすることはできません。

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

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

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

手記

詳細については、「Open Group 基本仕様 :正規表現、IEEE Std 1003.1、2004 Edition」を参照してください。.

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

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