about_Automatic_Variables

簡単な説明

PowerShell の状態情報を格納する変数について説明します。 これらの変数は、PowerShell によって作成および管理されます。

長い説明

概念的には、これらの変数は読み取り専用と見なされます。 書き込 み可能 であっても、下位互換性のために書き込 むべきではありません

PowerShell の自動変数の一覧を次に示します。

$$

セッションによって受信された最後の行の最後のトークンが含まれます。

$?

最後のコマンドの実行状態を格納します。 最後のコマンドが成功した場合は True 、失敗した場合 は False が含まれます。

パイプライン内の複数のステージで実行されるコマンドレットと高度な関数の場合 (たとえば、 ブロックと end ブロックの両方processで、 this.WriteError() と のように、this.ThrowTerminatingError()$PSCmdlet.ThrowTerminatingError()任意のポイント セットで または $PSCmdlet.WriteError() をそれぞれ False に設定$?します)。

コマンドレットはWrite-Error、実行直後に常に False に設定$?されますが、呼び出し元の関数では False には設定$?されません。

function Test-WriteError
{
    Write-Error "Bad"
    $? # $false
}

Test-WriteError
$? # $true

後者の目的では、代わりに を $PSCmdlet.WriteError() 使用する必要があります。

ネイティブ コマンド (実行可能ファイル) $? では、 が 0 場合$LASTEXITCODEは True に設定され、 が他の値の場合$LASTEXITCODEFalse に設定されます。

注意

PowerShell 7 まで、かっこ(...)内に ステートメントを含む部分式構文$(...)または配列式@(...)は常に True にリセット$?され、True と表示$?されます(Write-Error)。 これは PowerShell 7 で変更されているため、 $? これらの式で最後に実行されたコマンドの実際の成功が常に反映されます。

$^

セッションによって受信された最後の行の最初のトークンが含まれます。

$_

$PSItem と同じ。 パイプライン オブジェクト内の現在の オブジェクトを格納します。 この変数は、パイプライン内のすべてのオブジェクトに対してアクションを実行するコマンドで使用できます。

詳細については、「 about_PSItem」を参照してください。

$args

関数、スクリプト、またはスクリプト ブロックに渡される宣言されていないパラメーターの値の配列を格納します。 関数を作成するときは、 キーワードを使用 param してパラメーターを宣言するか、関数名の後にかっこで囲まれたパラメーターのコンマ区切りのリストを追加します。

イベント アクションでは、 $args 変数には、処理中のイベントのイベント引数を表す オブジェクトが含まれます。 この変数は、イベント登録コマンドの Action ブロック内でのみ設定されます。 この変数の値は、 を返す PSEventArgs オブジェクトの SourceArgs プロパティにも含Get-Eventまれています。

$ConsoleFileName

セッションで最後に使用されたコンソール ファイル (.psc1) のパスを格納します。 この変数は、 PSConsoleFile パラメーターを使用して PowerShell を起動するとき、または コマンドレットを Export-Console 使用してスナップイン名をコンソール ファイルにエクスポートするときに設定されます。

パラメーターを指定せずに コマンドレットを Export-Console 使用すると、セッションで最後に使用されたコンソール ファイルが自動的に更新されます。 この自動変数を使用して、更新するファイルを決定できます。

$EnabledExperimentalFeatures

現在有効になっている試験的な機能の名前の一覧が含まれます。

$Error

最新のエラーを表すエラー オブジェクトの配列を格納します。 最新のエラーは、配列 $Error[0]内の最初のエラー オブジェクトです。

配列にエラーが追加 $Error されないようにするには、 ErrorAction 共通パラメーターを使用し、値が Ignore です。 詳細については、「about_CommonParameters」を参照してください。

$Event

処理されているイベントを表す PSEventArgs オブジェクトを格納します。 この変数は、 などのRegister-ObjectEventイベント登録コマンドのブロック内Actionでのみ設定されます。 この変数の値は、コマンドレットが返すのと Get-Event 同じオブジェクトです。 スクリプト ブロックでは、 などの$Event.TimeGenerated変数のEventプロパティをAction使用できます。

$EventArgs

処理されているイベントの EventArgs から派生する最初のイベント引数を表す オブジェクトを格納します。 この変数は、イベント登録コマンドの Action ブロック内でのみ設定されます。 この変数の値は、 を返す PSEventArgs オブジェクトGet-EventSourceEventArgs プロパティでも確認できます。

$EventSubscriber

処理されているイベントのイベント サブスクライバーを表す PSEventSubscriber オブジェクトを格納します。 この変数は、イベント登録コマンドの Action ブロック内でのみ設定されます。 この変数の値は、コマンドレットが返すのと Get-EventSubscriber 同じオブジェクトです。

$ExecutionContext

PowerShell ホストの実行コンテキストを表す EngineIntrinsics オブジェクトを格納します。 この変数を使用して、コマンドレットで使用できる実行オブジェクトを見つけることができます。

$false

False を含みます。 この変数を使用すると、文字列 "false"を使用する代わりに、コマンドとスクリプトで False を表すことができます。 文字列が空でない文字列または 0 以外の整数に変換される場合、文字列は True として解釈できます。

$foreach

ForEach ループの列挙子 (結果の値ではない) を格納します。 変数は $ForEach 、ループの ForEach 実行中にのみ存在し、ループの完了後に削除されます。

列挙子には、ループ値を取得し、現在のループイテレーションを変更するために使用できるプロパティとメソッドが含まれています。 詳細については、「 列挙子の使用」を参照してください。

ホーム

ユーザーのホーム ディレクトリの完全なパスが含まれます。 Windows では、この変数は Windows 環境変数 (通常C:\Users\<UserName>は ) の"$env:USERPROFILE"値を使用します。 Unix では、この変数は環境変数の値を HOME 使用します。

重要

Windows では、ユーザーのプロファイルの場所をリダイレクトできます。 これは、 と $HOME 同じ値 $env:HOMEDRIVE$env:HOMEPATHを持たない可能性があることを意味します。

$Host

PowerShell の現在のホスト アプリケーションを表す オブジェクトを格納します。 この変数を使用すると、コマンドで現在のホストを表したり、 や などの$Host.version$Host.CurrentCultureホストのプロパティを表示または変更したりできます$host.UI.RawUI.SetBackGroundColor("Red")

$input

関数に渡されるすべての入力を列挙する列挙子が含まれます。 変数は $input 、関数とスクリプト ブロック (名前のない関数) でのみ使用できます。

  • 、、または end ブロックのないbeginprocess関数では、変数は$input関数へのすべての入力のコレクションを列挙します。

  • ブロックでは begin 、変数に $input データが含まれています。

  • ブロック内 process$input 変数には、現在パイプライン内にある オブジェクトが含まれています。

  • ブロックでは end 、変数は $input 関数に対するすべての入力のコレクションを列挙します。

    注意

    変数は $input 、同じ関数またはスクリプト ブロック内 processend ブロックと ブロックの両方で使用することはできません。

は列挙子であるため $input 、そのプロパティのいずれかにアクセスすると $input 、使用できなくなります。 プロパティを再利用$inputするために、別の変数にを格納$inputできます。

列挙子には、ループ値を取得し、現在のループイテレーションを変更するために使用できるプロパティとメソッドが含まれています。 詳細については、「 列挙子の使用」を参照してください。

変数は $input 、コマンド ラインから呼び出されたときに の -Commandpwsh パラメーターで指定されたコマンドでも使用できます。 次の例は、Windows コマンド シェルから実行されます。

echo Hello | pwsh -Command """$input World!"""

$IsCoreCLR

現在の $True セッションが .NET Core Runtime (CoreCLR) で実行されている場合は を格納します。 それ以外の場合は が $False含まれます。

$IsLinux

現在の $True セッションが Linux オペレーティング システムで実行されている場合は を格納します。 それ以外の場合は が $False含まれます。

$IsMacOS

現在の $True セッションが MacOS オペレーティング システムで実行されている場合は を格納します。 それ以外の場合は が $False含まれます。

$IsWindows

現在の $TRUE セッションが Windows オペレーティング システムで実行されている場合は を格納します。 それ以外の場合は が $FALSE含まれます。

$LASTEXITCODE

最後に実行されたネイティブ プログラムまたは PowerShell スクリプトの終了コードが含まれます。

PowerShell スクリプトの場合、 の $LASTEXITCODE 値は、スクリプトの呼び出し方法とキーワードが exit 使用されたかどうかによって異なります。

  • スクリプトで キーワードを使用する exit 場合、 は、 $LASTEXITCODE スクリプトの呼び出し方法に関係なく、指定された値に設定されます。 詳細については、「 about_Language_Keywords」を参照してください。
  • スクリプトが のような直接呼び出された場合、または のような./Test.ps1& ./Test.ps1呼び出し演算子 (&) を使用して呼び出された場合、 の$LASTEXITCODE値は変更されません。
  • File パラメーターを指定pwshしてスクリプトを呼び出すと、例外0がスローされ、それ以外の$LASTEXITCODE場合は、 の値が に1設定されます。

$Matches

変数は$Matches、 演算子と -notmatch 演算子で-match動作します。 スカラー入力を または -notmatch 演算子に-match送信し、いずれかの演算子が一致を検出すると、ブール値が返され、一致した文字列値のハッシュ テーブルが自動変数に設定$Matchesされます。 $Matches演算子で正規表現を使用する場合は、ハッシュ テーブルにキャプチャを設定-matchすることもできます。

演算子の -match 詳細については、「 about_Comparison_Operators」を参照してください。 正規表現の詳細については、「 about_Regular_Expressions」を参照してください。

変数は$Matches、 パラメーターを使用-Regexしたswitchステートメントでも機能します。 および 演算子と-notmatch同じ方法で-match設定されます。 ステートメントの switch 詳細については、「 about_Switch」を参照してください。

注意

$Matchesセッションで が設定されると、一致した値が別の一致によって上書きされるまで保持されます。 が再び使用され、一致するものが見つからない場合-matchは、 に$nullリセット$Matchesされません。 以前に一致した値は、別の一致が見つかるまで保持 $Matches されます。

$MyInvocation

現在のコマンドに関する情報 (名前、パラメーター、パラメーター値など) と、コマンドの起動、呼び出し、または呼び出し方法に関する情報 (現在のコマンドを呼び出したスクリプトの名前など) が含まれます。

$MyInvocation は、スクリプト、関数、およびスクリプト ブロックに対してのみ設定されます。 現在のスクリプトで返される $MyInvocationSystem.Management.Automation.InvocationInfo オブジェクトの情報 (スクリプト () のパスとファイル名、または関数 ($MyInvocation.MyCommand.Path$MyInvocation.MyCommand.Name) の名前など) を使用して、現在のコマンドを識別できます。 これは、現在のスクリプトの名前を見つけるのに役立ちます。

PowerShell 3.0 以降では、 MyInvocation 次の新しいプロパティがあります。

  • PSScriptRoot - 現在のコマンドを呼び出したスクリプトへの完全なパスが含まれます。 このプロパティの値は、呼び出し元がスクリプトである場合にのみ設定されます。
  • PSCommandPath - 現在のコマンドを呼び出したスクリプトの完全なパスとファイル名が含まれます。 このプロパティの値は、呼び出し元がスクリプトである場合にのみ設定されます。

$PSScriptRoot自動変数と$PSCommandPath自動変数とは異なり、自動変数の PSScriptRoot プロパティと PSCommandPath プロパティには、現在の$MyInvocationスクリプトではなく、呼び出し元または呼び出し元のスクリプトに関する情報が含まれます。

$NestedPromptLevel

現在のプロンプト レベルが含まれます。 値 0 は、元のプロンプト レベルを示します。 値は、入れ子になったレベルを入力するとインクリメントされ、終了時にデクリメントされます。

たとえば、 メソッドを使用すると、PowerShell によって入れ子になったコマンド プロンプトが $Host.EnterNestedPrompt 表示されます。 PowerShell デバッガーでブレークポイントに到達すると、PowerShell には入れ子になったコマンド プロンプトも表示されます。

入れ子になったプロンプトを入力すると、PowerShell によって現在のコマンドが一時停止され、実行コンテキストが保存され、変数の値が $NestedPromptLevel インクリメントされます。 追加の入れ子になったコマンド プロンプト (最大 128 レベル) を作成するか、元のコマンド プロンプトに戻すには、コマンドを完了するか、「」と入力します exit

変数は $NestedPromptLevel 、プロンプト レベルを追跡するのに役立ちます。 この値が常に表示されるように、この値を含む別の PowerShell コマンド プロンプトを作成できます。

$null

$null は、 null または空の値を含む自動変数です。 この変数を使用して、コマンドとスクリプトに存在しない値または未定義の値を表すことができます。

PowerShell は、値を持つオブジェクト (つまり、明示的なプレースホルダー) として扱 $null うので、 を使用 $null して、一連の値の空の値を表すことができます。

たとえば、 がコレクションに含まれている場合 $null 、オブジェクトの 1 つとしてカウントされます。

$a = "one", $null, "three"
$a.count
3

コマンドレットに変数を$nullForEach-Objectパイプすると、他のオブジェクトの場合と同様に、 の値$nullが生成されます。

"one", $null, "three" | ForEach-Object { "Hello " + $_}
Hello one
Hello
Hello three

その結果、 を使用 $null して パラメーター値がないことを意味することはできません。 のパラメーター値 $null は、既定のパラメーター値をオーバーライドします。

ただし、PowerShell では変数が $null プレースホルダーとして扱われるため、次のようなスクリプトで使用できますが、無視された場合 $null は機能しません。

$calendar = @($null, $null, "Meeting", $null, $null, "Team Lunch", $null)
$days = "Sunday","Monday","Tuesday","Wednesday","Thursday",
        "Friday","Saturday"
$currentDay = 0
foreach($day in $calendar)
{
    if($day -ne $null)
    {
        "Appointment on $($days[$currentDay]): $day"
    }

    $currentDay++
}
Appointment on Tuesday: Meeting
Appointment on Friday: Team lunch

$PID

現在の PowerShell セッションをホストしているプロセスのプロセス識別子 (PID) が含まれます。

$profile

現在のユーザーと現在のホスト アプリケーションの PowerShell プロファイルの完全なパスが含まれます。 この変数を使用して、コマンドでプロファイルを表すことができます。 たとえば、それをコマンドで使用して、プロファイルが作成されているかどうかを確認できます。

Test-Path $PROFILE

または、それをコマンドで使用してプロファイルを作成することもできます。

New-Item -ItemType file -Path $PROFILE -Force

コマンドでそれを使用して、 でプロファイルを開 notepad.exe

notepad.exe $PROFILE

$PSBoundParameters

スクリプトまたは関数に渡されるパラメーターとその現在の値のディクショナリが含まれます。 この変数には、スクリプトや関数などのパラメーターが宣言されているスコープ内でのみ値があります。 これを使用して、パラメーターの現在の値を表示または変更したり、パラメーター値を別のスクリプトまたは関数に渡したりすることができます。

この例では、Test2 関数は Test1$PSBoundParameters 関数に を渡します。 は $PSBoundParametersキーの形式で表示されます。

function Test1 {
   param($a, $b)

   # Display the parameters in dictionary format.
   $PSBoundParameters
}

function Test2 {
   param($a, $b)

   # Run the Test1 function with $a and $b.
   Test1 @PSBoundParameters
}
Test2 -a Power -b Shell
Key   Value
---   -----
a     Power
b     Shell

$PSCmdlet

実行されているコマンドレットまたは高度な関数を表す オブジェクトを格納します。

コマンドレットまたは関数コードで オブジェクトのプロパティとメソッドを使用して、使用条件に応答できます。 たとえば、 ParameterSetName プロパティには使用されているパラメーター セットの名前が含まれており、 ShouldProcess メソッドは WhatIf パラメーターと Confirm パラメーターをコマンドレットに動的に追加します。

自動変数の $PSCmdlet 詳細については、「 about_Functions_CmdletBindingAttributeabout_Functions_Advanced」を参照してください。

$PSCommandPath

実行されているスクリプトの完全なパスとファイル名が含まれます。 この変数は、すべてのスクリプトで有効です。

$PSCulture

PowerShell 7 以降では、 $PSCulture 現在の PowerShell 実行空間 (セッション) のカルチャが反映されています。 PowerShell 実行空間でカルチャが変更された場合、 $PSCulture その実行空間の値が更新されます。

カルチャは、数値、通貨、日付などのアイテムの表示形式を決定し、 System.Globalization.CultureInfo オブジェクトに格納されます。 コンピューターのカルチャを表示するには、 を使用 Get-Culture します。 $PSCulture には、 Name プロパティの値が含まれています。

$PSDebugContext

デバッグ中、この変数にはデバッグ環境に関する情報が含まれます。 それ以外の場合は、 null 値が含まれます。 その結果、デバッガーに制御があるかどうかを判断するために使用できます。 設定すると、ブレークポイントInvocationInfo プロパティを持つ PsDebugContext オブジェクトが含まれます。 InvocationInfo プロパティには、Location プロパティなど、いくつかの便利なプロパティがあります。 Location プロパティは、デバッグ中のスクリプトのパスを示します。

$PSEdition

に同じ値が $PSVersionTable.PSEdition含まれています。 この変数はモジュール マニフェスト ファイルで使用できるのに対し $PSVersionTable 、 は使用できません。

$PSHOME

PowerShell のインストール ディレクトリの完全なパス (通常 $env:windir\System32\PowerShell\v1.0 は Windows システム) が含まれます。 この変数は、PowerShell ファイルのパスで使用できます。 たとえば、次のコマンドは、概念的なヘルプ トピック で変数という単語を検索します。

Select-String -Pattern Variable -Path $pshome\*.txt

$PSItem

$_ と同じ。 パイプライン オブジェクト内の現在の オブジェクトを格納します。 この変数は、パイプライン内のすべてのオブジェクトに対してアクションを実行するコマンドで使用できます。

詳細については、「 about_PSItem」を参照してください。

$PSScriptRoot

実行中のスクリプトの親ディレクトリの完全なパスを格納します。

PowerShell 2.0 では、この変数はスクリプト モジュール (.psm1) でのみ有効です。 PowerShell 3.0 以降では、すべてのスクリプトで有効です。

$PSSenderInfo

PSSession を開始したユーザーに関する情報 (ユーザー ID や、発信元コンピューターのタイム ゾーンなど) が含まれます。 この変数は PSSessions でのみ使用できます。

変数には $PSSenderInfo 、ユーザーが構成可能なプロパティ ApplicationArguments が含まれています。既定では、元のセッションからの のみが $PSVersionTable 含まれます。 ApplicationArguments プロパティにデータを追加するには、 コマンドレットの ApplicationArguments パラメーターをNew-PSSessionOption使用します。

$PSUICulture

オペレーティング システムで現在使用されているユーザー インターフェイス (UI) カルチャの名前を格納します。 UI カルチャは、どのテキスト文字列がメニューやメッセージなどのユーザー インターフェイス要素に使用されるかを決定します。 これは System.Globalization.CultureInfo の値です。Currentシステムの UICulture.Name プロパティ。 システムの System.Globalization.CultureInfo オブジェクトを取得するには、 コマンドレットを使用しますGet-UICulture

$PSVersionTable

現在のセッションで実行されている PowerShell のバージョンに関する詳細を表示する読み取り専用ハッシュ テーブルが含まれています。 テーブルには、次の項目が含まれています。

  • PSVersion - PowerShell のバージョン番号
  • PSEdition このプロパティの値は、PowerShell 4 以下の場合は "Desktop" であり、フル機能の Windows エディションでは PowerShell 5.1 です。 このプロパティの値Coreは、PowerShell 6 以降と、Windows Nano Server や Windows IoT などのフットプリントの小さいエディションでは Windows PowerShell 5.1 です。
  • GitCommitId - GitHub のソース ファイルのコミット ID。
  • OS - PowerShell が実行されているオペレーティング システムの説明。
  • プラットフォーム - オペレーティング システムが実行されているプラットフォーム。 Linux と macOS の値は Unix です$IsMacOs$IsLinux を参照してください。
  • PSCompatibleVersions - 現在のバージョンと互換性のある PowerShell のバージョン
  • PSRemotingProtocolVersion - PowerShell リモート管理プロトコルのバージョン。
  • SerializationVersion - シリアル化メソッドのバージョン
  • WSManStackVersion - WS-Management スタックのバージョン番号

$PWD

現在の PowerShell 実行空間の現在のディレクトリの場所の完全なパスを表すパス オブジェクトを格納します。

注意

PowerShell では、プロセスごとに複数の実行空間がサポートされます。 各実行空間には、独自の 現在のディレクトリがあります。 これは、プロセスの現在のディレクトリと同じではありません。 [System.Environment]::CurrentDirectory

$Sender

このイベントを生成したオブジェクトを格納します。 この変数は、イベント登録コマンドの Action ブロック内でのみ設定されます。 この変数の値は、 を返す PSEventArgs オブジェクトの Sender プロパティでも確認 Get-Event できます。

$ShellId

現在のシェルの識別子を格納します。

$StackTrace

最新のエラーのスタック トレースが含まれています。

$switch

ステートメントの結果の値ではなく列挙子を Switch 格納します。 変数は $switch 、ステートメントの Switch 実行中にのみ存在し、ステートメントの実行が完了すると switch 削除されます。 詳細については、「 about_Switch」を参照してください。

列挙子には、ループ値を取得し、現在のループイテレーションを変更するために使用できるプロパティとメソッドが含まれています。 詳細については、「 列挙子の使用」を参照してください。

$this

変数は $this 、クラス自体のインスタンスを参照するようにクラスを拡張するスクリプト ブロックで使用されます。

PowerShell の拡張可能な型システム (ETS) を使用すると、スクリプト ブロックを使用してクラスにプロパティを追加できます。 スクリプト プロパティまたはスクリプト メソッドを定義するスクリプト ブロックでは、 $this 変数は拡張されているクラスのオブジェクトのインスタンスを参照します。 たとえば、PowerShell では ETS を使用して BaseName プロパティを FileInfo クラスに追加します。

PS> Get-ChildItem .\README.md | Get-Member BaseName | Format-List

TypeName   : System.IO.FileInfo
Name       : BaseName
MemberType : ScriptProperty
Definition : System.Object BaseName {get=if ($this.Extension.Length -gt 0)
             {$this.Name.Remove($this.Name.Length - $this.Extension.Length
             )}else{$this.Name};}

詳細については、「 about_Types.ps1xml」を参照してください。

PowerShell クラスでは、変数は $this クラス自体のインスタンス オブジェクトを参照し、クラスで定義されているプロパティとメソッドへのアクセスを許可します。 詳細については、「about_Remote」を参照してください。

変数は $this 、スクリプト ブロックをイベント ハンドラーのデリゲートとして受け取る .NET イベント クラスでも使用されます。 このシナリオでは、 $this はイベントを発生させるオブジェクト (イベント送信者と呼ばれます) を表します。

$true

True を含みます。 この変数を使用すると、コマンドとスクリプトで True を 表すことができます。

列挙子の使用

$input$foreach、および $switch の各変数は、含まれているコード ブロックによって処理される値を反復処理するために使用されるすべての列挙子です。

列挙子には、反復を進めたりリセットしたり、反復値を取得したりするために使用できるプロパティとメソッドが含まれています。 列挙子を直接操作することは、ベスト プラクティスとは見なされません。

  • ループ内では、フロー制御キーワード が中断 して 続行 することをお勧めします。

  • パイプライン入力を受け入れる関数内では、ValueFromPipeline 属性または ValueFromPipelineByPropertyName 属性でパラメーターを使用することをお勧めします。

    詳細については、「 about_Functions_Advanced_Parameters」を参照してください。

MoveNext

MoveNext メソッドは、列挙子をコレクションの次の要素に進めます。 MoveNext は、 True 列挙子が正常に詳細設定された場合、 False 列挙子がコレクションの末尾を通過した場合に を返します。

注意

MoveNext によって返されるブール値は、出力ストリームに送信されます。 出力を非表示にするには、出力を [void] に型キャストするか 、Out-Null にパイプします。

$input.MoveNext() | Out-Null
[void]$input.MoveNext()

Reset

メソッドは Reset 、列挙子を最初の位置 (コレクション内の最初の要素の ) に設定します。

Current

プロパティは Current 、列挙子の現在位置にあるコレクション (パイプライン) 内の要素を取得します。

MoveNext が呼び出されるまで、プロパティは Current 引き続き同じプロパティ 返します。

例 1: $input変数の使用

次の例では、 変数に $input アクセスすると、次にプロセス ブロックが実行されるまで変数がクリアされます。 メソッドを Reset 使用すると、変数が $input 現在のパイプライン値にリセットされます。

function Test
{
    begin
    {
        $i = 0
    }

    process
    {
        "Iteration: $i"
        $i++
        "`tInput: $input"
        "`tAccess Again: $input"
        $input.Reset()
        "`tAfter Reset: $input"
    }
}

"one","two" | Test
Iteration: 0
    Input: one
    Access Again:
    After Reset: one
Iteration: 1
    Input: two
    Access Again:
    After Reset: two

プロセス ブロックは、アクセスしない場合でも変数を $input 自動的に進めます。

$skip = $true
function Skip
{
    begin
    {
        $i = 0
    }

    process
    {
        "Iteration: $i"
        $i++
        if ($skip)
        {
            "`tSkipping"
            $skip = $false
        }
        else
        {
            "`tInput: $input"
        }
    }
}

"one","two" | Skip
Iteration: 0
    Skipping
Iteration: 1
    Input: two

例 2: プロセス ブロックの外部で$inputを使用する

プロセス ブロックの外側では、変数は $input 関数にパイプされたすべての値を表します。

  • 変数にアクセスすると、 $input すべての値がクリアされます。
  • メソッドは Reset コレクション全体をリセットします。
  • プロパティは Current 設定されません。
  • MoveNext メソッドは false を返します。これは、コレクションを高度にできないためです。
    • MoveNext を呼び出すと、変数がクリアされます$input
Function All
{
    "All Values: $input"
    "Access Again: $input"
    $input.Reset()
    "After Reset: $input"
    $input.MoveNext() | Out-Null
    "After MoveNext: $input"
}

"one","two","three" | All
All Values: one two three
Access Again:
After Reset: one two three
After MoveNext:

例 3: $inputの使用。Current プロパティ

プロパティを Current 使用すると、 メソッドを使用 Reset せずに、現在のパイプライン値に複数回アクセスできます。 プロセス ブロックは、 MoveNext メソッドを自動的に呼び出しません。

MoveNext を明示的に呼び出さない限り、プロパティはCurrent設定されません。 プロパティは Current 、その値をクリアせずに、プロセス ブロック内で複数回アクセスできます。

function Current
{
    begin
    {
        $i = 0
    }

    process
    {
        "Iteration: $i"
        $i++
        "`tBefore MoveNext: $($input.Current)"
        $input.MoveNext() | Out-Null
        "`tAfter MoveNext: $($input.Current)"
        "`tAccess Again: $($input.Current)"
    }
}

"one","two" | Current
Iteration: 0
    Before MoveNext:
    After MoveNext: one
    Access Again: one
Iteration: 1
    Before MoveNext:
    After MoveNext: two
    Access Again: two

例 4: $foreach変数の使用

$input変数とは異なり、変数は$foreach、直接アクセスすると、コレクション内のすべての項目を常に表します。 現在の Current コレクション要素にアクセスするには プロパティを使用し、値を Reset 変更するには MoveNext メソッドと MoveNext メソッドを使用します。

注意

ループの各反復では、foreachMoveNext メソッドが自動的に呼び出されます。

次のループは 2 回だけ実行されます。 2 番目のイテレーションでは、イテレーションが完了する前にコレクションが 3 番目の要素に移動されます。 2 回目のイテレーションの後、反復処理する値がもうなくなり、ループが終了します。

MoveNext プロパティは、コレクションを反復処理するために選択された変数には影響しません ($Num)。

$i = 0
foreach ($num in ("one","two","three"))
{
    "Iteration: $i"
    $i++
    "`tNum: $num"
    "`tCurrent: $($foreach.Current)"

    if ($foreach.Current -eq "two")
    {
        "Before MoveNext (Current): $($foreach.Current)"
        $foreach.MoveNext() | Out-Null
        "After MoveNext (Current): $($foreach.Current)"
        "Num has not changed: $num"
    }
}
Iteration: 0
        Num: one
        Current: one
Iteration: 1
        Num: two
        Current: two
Before MoveNext (Current): two
After MoveNext (Current): three
Num has not changed: two

メソッドを使用すると、 Reset コレクション内の現在の要素がリセットされます。 次の例では、 メソッドが呼び出されるため、最初の 2 つの要素を Reset2 回ループ処理します。 最初の 2 つのループの後、ステートメントは if 失敗し、ループは通常 3 つの要素すべてを反復処理します。

重要

これにより、無限ループが発生する可能性があります。

$stopLoop = 0
foreach ($num in ("one","two", "three"))
{
    ("`t" * $stopLoop) + "Current: $($foreach.Current)"

    if ($num -eq "two" -and $stopLoop -lt 2)
    {
        $foreach.Reset() | Out-Null
        ("`t" * $stopLoop) + "Reset Loop: $stopLoop"
        $stopLoop++
    }
}
Current: one
Current: two
Reset Loop: 0
        Current: one
        Current: two
        Reset Loop: 1
                Current: one
                Current: two
                Current: three

例 5: $switch変数の使用

変数には $switch 、変数とまったく同じ規則があります $foreach 。 次の例では、すべての列挙子の概念を示します。

注意

MoveNext メソッドの後にステートメントがない場合でも、NotEvaluated ケースが実行されないことbreakに注意してください。

$values = "Start", "MoveNext", "NotEvaluated", "Reset", "End"
$stopInfinite = $false
switch ($values)
{
    "MoveNext" {
        "`tMoveNext"
        $switch.MoveNext() | Out-Null
        "`tAfter MoveNext: $($switch.Current)"
    }
    # This case is never evaluated.
    "NotEvaluated" {
        "`tAfterMoveNext: $($switch.Current)"
    }

    "Reset" {
        if (!$stopInfinite)
        {
            "`tReset"
            $switch.Reset()
            $stopInfinite = $true
        }
    }

    default {
        "Default (Current): $($switch.Current)"
    }
}
Default (Current): Start
    MoveNext
    After MoveNext: NotEvaluated
    Reset
Default (Current): Start
    MoveNext
    After MoveNext: NotEvaluated
Default (Current): End

関連項目