簡単な説明
PowerShell によって作成および管理される状態情報を格納する変数について説明します。
長い説明
概念的には、これらの変数のほとんどは読み取り専用と見なされます。 書き込むことは 可能ですが 下位互換性を考慮すると 書き込む べきではありません。
PowerShell の自動変数の一覧を次に示します。
$$$?$^$_$args$ConsoleFileName$EnabledExperimentalFeatures$Error$Event$EventArgs$EventSubscriber$ExecutionContext$false$foreach$HOME$Host$input$IsCoreCLR$IsLinux$IsMacOS$IsWindows$LASTEXITCODE$Matches$MyInvocation$NestedPromptLevel$null$PID$PROFILE$PSBoundParameters$PSCmdlet$PSCommandPath$PSCulture$PSDebugContext$PSEdition$PSHOME$PSItem$PSScriptRoot$PSSenderInfo$PSUICulture$PSVersionTable$PWD$Sender$ShellId$StackTrace$switch$this$true
$$
セッションによって受信された最後の行の最後のトークンを格納します。
$?
最後のコマンドの実行状態を格納します。 最後のコマンドが成功した場合は True を含み、失敗した場合は False します。 解析エラーは実行されないため、$?の値には影響しません。
パイプライン内の複数のステージで実行されるコマンドレットや高度な関数について、たとえば process ブロックおよび end ブロックの両方で動作する場合、this.WriteError() または $PSCmdlet.WriteError() を任意のポイントで呼び出すと、$? が の Falseに設定されます。これは、this.ThrowTerminatingError() や $PSCmdlet.ThrowTerminatingError()の動作と同様です。
function Test-WriteError
{
Write-Error "Bad"
"The `$? variable is: $?"
}
Test-WriteError
"Now the `$? variable is: $?"
Test-WriteError:
Line |
7 | Test-WriteError
| ~~~~~~~~~~~~~~~
| Bad
The $? variable is: False
Now the $? variable is: True
後者の目的では、代わりに $PSCmdlet.WriteError() を使用する必要があります。
ネイティブ コマンド (実行可能ファイル) の場合、
手記
PowerShell 7 までは、かっこ (...)、部分式構文 $(...)、または配列式 @(...) 内のステートメントをラップすると、必ず $? が [True] にリセットされます。 たとえば、(Write-Error) は $? を Trueとして表示します。 この動作は PowerShell 7 で変更され、$? はこれらの式で最後に実行されたコマンドの実際の成功を常に反映します。
$^
セッションによって受信された最後の行の最初のトークンを格納します。
$_
$PSItemと同じです。 パイプライン オブジェクト内の現在のオブジェクトを格納します。 この変数は、パイプライン内のすべてのオブジェクトに対してアクションを実行するコマンドで使用できます。
詳細については、about_PSItemを参照してください。
$args
関数、スクリプト、またはスクリプト ブロックに渡される宣言されていないパラメーターの値の配列を格納します。 関数を作成するときは、param キーワードを使用するか、関数名の後にかっこで囲まれたパラメーターのコンマ区切りリストを追加して、パラメーターを宣言できます。
イベント アクションでは、$args 変数には、処理中のイベントのイベント引数を表すオブジェクトが含まれます。 この変数は、イベント登録コマンドの Action ブロック内でのみ設定されます。 この変数の値は、返されるPSEventArgsオブジェクトのGet-Event プロパティで見つけることもできます。
$ConsoleFileName
セッションで最後に使用されたコンソール ファイル (.psc1) のパスが含まれます。 この変数は、PSConsoleFile パラメーターを使用して PowerShell を起動するとき、または Export-Console コマンドレットを使用してスナップイン名をコンソール ファイルにエクスポートするときに設定されます。
パラメーターを指定せずに Export-Console コマンドレットを使用すると、セッションで最後に使用されたコンソール ファイルが自動的に更新されます。 この自動変数を使用して、更新するファイルを決定できます。
$EnabledExperimentalFeatures
有効になっている実験用機能の名前の一覧が含まれます。
$Error
最新のエラーを表すエラー オブジェクトの配列が含まれています。 最新のエラーは、配列 $Error[0]の最初のエラー オブジェクトです。
エラーが $Error 配列に追加されないようにするには、ErrorAction 共通パラメーターを使用し、値として Ignoreを指定します。 詳細については、about_CommonParametersを参照してください。
$Event
処理中のイベントを表す PSEventArgs オブジェクトを格納します。 この変数は、イベント登録コマンドの Action ブロック内 (Register-ObjectEventなど) 内でのみ設定されます。 この変数の値は、Get-Event コマンドレットが返すのと同じオブジェクトです。
Event スクリプト ブロックでは、$Event.TimeGeneratedなどの Action 変数のプロパティを使用できます。
$EventArgs
処理中のイベントの EventArgs Action ブロック内でのみ設定されます。 この変数の値は、 が返す PSEventArgs オブジェクトの Get-Event プロパティにも見つけることができます。
$EventSubscriber
処理中のイベントのイベント サブスクライバーを表す PSEventSubscriber オブジェクトを格納します。 この変数は、イベント登録コマンドの Action ブロック内でのみ設定されます。 この変数の値は、Get-EventSubscriber コマンドレットが返すのと同じオブジェクトです。
$ExecutionContext
PowerShell ホストの実行コンテキストを表す EngineIntrinsics オブジェクトを格納します。 この変数を使用して、コマンドレットで使用できる実行オブジェクトを見つけることができます。
$false
Falseを含みます。 この変数を使用すると、文字列 を使用する代わりに、コマンドとスクリプトで "false" を表すことができます。 文字列は、空でない文字列または 0 以外の整数に変換される場合、True として解釈できます。
$foreach
foreach ループの列挙子 (結果の値ではなく) を格納します。
$foreach 変数は、foreach ループの実行中にのみ存在します。ループが完了すると削除されます。
列挙子には、ループ値を取得し、現在のループイテレーションを変更するために使用できるプロパティとメソッドが含まれています。 詳細については、「列挙子の使用
$HOME
ユーザーのホーム ディレクトリの完全なパスが含まれています。 Windows では、この変数は "$Env:USERPROFILE" Windows 環境変数 (通常は C:\Users\<UserName>) の値を使用します。 Unix では、この変数は HOME 環境変数の値を使用します。
重要
Windows では、ユーザーのプロファイルの場所をリダイレクトできます。 これは、$HOME が "$Env:HOMEDRIVE$Env:HOMEPATH"と同じ値を持たない可能性があることを意味します。
$Host
PowerShell の現在のホスト アプリケーションを表すオブジェクトを格納します。
この変数を使用すると、コマンドで現在のホストを表したり、ホストのプロパティ ($Host.Version、$Host.CurrentCulture、$Host.UI.RawUI.BackGroundColor = "Red"など) を表示または変更したりできます。
手記
$Host.PrivateData の色設定は、$PSStyle 基本設定変数に置き換えられました。 詳細については、about_ANSI_Terminalsを参照してください。
$input
関数に渡されるすべての入力を列挙する列挙子を格納します。
$input 変数は、関数、スクリプト ブロック (名前のない関数)、スクリプト ファイル (保存されたスクリプト ブロック) でのみ使用できます。
begin、process、またはendブロックを持たない関数では、$input変数は関数へのすべての入力のコレクションを列挙します。beginブロックでは、$input変数にはデータが含まれていません。processブロックでは、$input変数にパイプライン内の現在のオブジェクトが含まれています。endブロックでは、$input変数は関数へのすべての入力のコレクションを列挙します。手記
$input変数は、同じ関数またはスクリプト ブロック内のprocessブロックとendブロックの両方で使用することはできません。
$input は列挙子であるため、プロパティのいずれかにアクセスすると、$input は使用できなくなります。
$input を別の変数に格納して、$input プロパティを再利用できます。
列挙子には、ループ値を取得し、現在のループイテレーションを変更するために使用できるプロパティとメソッドが含まれています。 詳細については、「列挙子の使用
$input 変数は、コマンド ラインから呼び出されたときに、-Command の pwsh パラメーターで指定されたコマンドでも使用できます。 次の例は、Windows コマンド シェルから実行されます。
echo Hello | pwsh -Command """$input World!"""
$IsCoreCLR
現在のセッションが .NET Core ランタイム (CoreCLR) で実行されている場合の $true が含まれます。 それ以外の場合は、$falseが含まれます。
$IsLinux
現在のセッションが Linux オペレーティング システムで実行されている場合の $true が含まれます。
それ以外の場合は、$falseが含まれます。
$IsMacOS
現在のセッションが macOS オペレーティング システムで実行されている場合の $true が含まれます。
それ以外の場合は、$falseが含まれます。
$IsWindows
現在のセッションが Windows オペレーティング システムで実行されている場合の $true が含まれます。 それ以外の場合は、$falseが含まれます。
$LASTEXITCODE
最後に実行されたネイティブ プログラムまたは PowerShell スクリプトの終了コードが含まれます。
PowerShell スクリプトの場合、$LASTEXITCODE の値は、スクリプトの呼び出し方法と、exit キーワードが使用されたかどうかによって異なります。
スクリプトで
exitキーワードを使用する場合:$LASTEXITCODEは、exitキーワードによって指定された値に設定されます。 詳細については、 about_Language_Keywordsを参照してください。./Test.ps1などのスクリプトが直接呼び出されたとき、または のような&(& ./Test.ps1) を使用する場合:$LASTEXITCODEの値は、次の場合を除き変更されません。- このスクリプトは、
exitキーワードを使用する別のスクリプトを呼び出します - スクリプトはネイティブ コマンドを呼び出します
- このスクリプトでは、
exitキーワードを使用します
- このスクリプトは、
pwshパラメーターを使用して を使用してスクリプトを呼び出すと、$LASTEXITCODEは次の値に設定されます。- 例外が原因でスクリプトが終了した場合の
1 - スクリプトで使用する場合は、
exitキーワードで指定された値 - スクリプトが正常に完了したかどうかを
0する
- 例外が原因でスクリプトが終了した場合の
pwshパラメーターを使用してスクリプトを で呼び出すと、$LASTEXITCODEは次の値に設定されます。-
1例外が原因でスクリプトが終了した場合、または最後のコマンドの結果が$?を$falseに設定した場合 - スクリプトが正常に完了し、最後のコマンドの結果が
0$?に設定されたかどうかを$trueします
-
$Matches
$Matches 変数は、-match 演算子と -notmatch 演算子で動作します。
スカラー 入力を -match 演算子または -notmatch 演算子に送信すると、いずれかの演算子が一致を検出した場合、ブール値が返され、$Matches 自動変数に一致した文字列値のハッシュテーブルが設定されます。
$Matches 演算子で正規表現を使用する場合は、-match ハッシュ テーブルにキャプチャを設定することもできます。
-match 演算子の詳細については、about_Comparison_Operatorsを参照してください。 正規表現の詳細については、about_Regular_Expressionsを参照してください。
$Matches 変数は、switch パラメーターを持つ -Regex ステートメントでも機能します。
-match 演算子や -notmatch 演算子と同じ方法で入力されます。
switch ステートメントの詳細については、about_Switchを参照してください。
手記
セッションに $Matches が設定されると、一致した値が別の一致によって上書きされるまで保持されます。
-match が再び使用され、一致するものが見つからない場合、$Matches は $nullにリセットされません。 以前に一致した値は、別の一致が見つかるまで $Matches に保持されます。
$MyInvocation
現在のコマンドに関する情報 (名前、パラメーター、パラメーター値など) と、コマンドの起動、呼び出し、呼び出し方法に関する情報 (現在のコマンドを呼び出したスクリプトの名前など) が含まれます。
$MyInvocation は、スクリプト、関数、およびスクリプト ブロックに対してのみ設定されます。 現在のスクリプトで によって返される $MyInvocation オブジェクト内の情報を使用して、関数名 ($MyInvocation.MyCommand.Name) などを用いて、現在のコマンドを識別できます。
これは、現在のスクリプトの名前を見つけるのに役立ちます。
PowerShell 3.0 以降、MyInvocation には次の新しいプロパティがあります。
- PSScriptRoot - 現在のコマンドを呼び出したスクリプトへの完全なパスが含まれています。 このプロパティの値は、呼び出し元がスクリプトである場合にのみ設定されます。
- PSCommandPath - 現在のコマンドを呼び出したスクリプトの完全なパスとファイル名が含まれています。 このプロパティの値は、呼び出し元がスクリプトである場合にのみ設定されます。
$PSScriptRoot や $PSCommandPath の自動変数とは異なり、 自動変数の PSScriptRoot プロパティと $MyInvocation プロパティには、現在のスクリプトではなく、呼び出し元または呼び出しスクリプトに関する情報が含まれます。
$NestedPromptLevel
現在のプロンプトレベルを含んでいます。 値 0 は、元のプロンプト レベルを示します。 値は、入れ子レベルに入るとインクリメントされ、抜けるとデクリメントされます。
たとえば、$Host.EnterNestedPrompt メソッドを使用すると、PowerShell によって入れ子になったコマンド プロンプトが表示されます。 PowerShell デバッガーでブレークポイントに到達すると、PowerShell には入れ子になったコマンド プロンプトも表示されます。
入れ子になったプロンプトを入力すると、PowerShell は現在のコマンドを一時停止し、実行コンテキストを保存して、$NestedPromptLevel 変数の値をインクリメントします。 追加の入れ子になったコマンド プロンプト (最大 128 レベル) を作成するか、元のコマンド プロンプトに戻すには、コマンドを完了するか、「exit」と入力します。
$NestedPromptLevel 変数は、プロンプト レベルを追跡するのに役立ちます。 常に表示されるように、この値を含む代替の PowerShell コマンド プロンプトを作成できます。
$null
$null は、null または空の値を含む自動変数です。 この変数を使用して、コマンドとスクリプトで存在しない値または未定義の値を表すことができます。
PowerShell は $null を値を持つオブジェクトまたはプレースホルダーとして扱うので、$null を使用して値のコレクション内の空の値を表すことができます。
たとえば、$null がコレクションに含まれている場合、オブジェクトの 1 つとしてカウントされます。
$a = "one", $null, "three"
$a.Count
3
$null 変数を ForEach-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 関数は、$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_CmdletBindingAttribute と about_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 のインストール ディレクトリの完全なパス (通常は Windows システムの C:\Program Files\PowerShell\7) が含まれます。 この変数は、PowerShell ファイルのパスで使用できます。 たとえば、次のコマンドは、概念的なヘルプ トピック内で、 ヘルプという用語を検索します。
Select-String -Pattern Help -Path $PSHOME\en-US\*.txt
$PSItem
$_と同じです。 パイプライン オブジェクト内の現在のオブジェクトを格納します。 この変数は、パイプライン内のすべてのオブジェクトに対してアクションを実行するコマンドで使用できます。
詳細については、about_PSItemを参照してください。
$PSScriptRoot
実行中のスクリプトの親ディレクトリの完全なパスが含まれています。
PowerShell 2.0 では、この変数はスクリプト モジュール (.psm1) でのみ有効です。
PowerShell 3.0 以降では、すべてのスクリプトで有効です。
$PSSenderInfo
PSSession を開始したユーザーに関する情報 (ユーザー ID や発信元コンピューターのタイム ゾーンなど) が含まれます。 この変数は PSSessions でのみ使用できます。
New-PSSessionOption パラメーターを使用します。
$PSUICulture
オペレーティング システムで構成されているユーザー インターフェイス (UI) カルチャの名前を格納します。 UI カルチャは、メニューやメッセージなどのユーザー インターフェイス要素に使用されるテキスト文字列を決定します。 これは、システムの System.Globalization.CultureInfo.CurrentUICulture.Name プロパティの値です。 システムの System.Globalization.CultureInfo オブジェクトを取得するには、Get-UICulture コマンドレットを使用します。
$PSVersionTable
現在のセッションで実行されている PowerShell のバージョンに関する詳細を表示する読み取り専用ハッシュ テーブルが含まれています。 この表には、次の項目が含まれています。
- PSVersion - PowerShell のバージョン番号
-
PSEdition このプロパティの値は、PowerShell 4 以下の場合は "Desktop" であり、フル機能の Windows エディションでは PowerShell 5.1 になります。 このプロパティの値は、PowerShell 6 以降の
Coreと、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 の Get-Event オブジェクトの Sender プロパティに、この変数の値を見つけることもできます。
$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_Classesを参照してください。
$this 変数は、スクリプト ブロックをイベント ハンドラーのデリゲートとして受け取る .NET イベント クラスでも使用されます。 このシナリオでは、$this はイベント送信者と呼ばれるイベントの発生元オブジェクトを表します。
$true
Trueを含んでいます。 この変数を使用すると、コマンドとスクリプト True を表すことができます。
列挙子の使用
$input、$foreach、および $switch 変数は、含まれるコード ブロックによって処理される値を反復処理するために使用されるすべての列挙子です。
列挙子には、反復を進めたりリセットしたり、反復値を取得したりするために使用できるプロパティとメソッドが含まれています。 列挙子を直接操作することはベスト プラクティスとは見なされません。
パイプライン入力を受け入れる関数では、ValueFromPipeline または ValueFromPipelineByPropertyName 属性のパラメーターを使用することが推奨されます。
詳細については、about_Functions_Advanced_Parametersを参照してください。
次へ移動
MoveNext メソッドは、列挙子をコレクションの次の要素に進めます。
MoveNext は、列挙子が正常に進んだ場合に True を返します。列挙子がコレクションの末尾を通過した場合に False します。
手記
MoveNext によって返される プール値 が出力ストリームに送信されます。
出力結果を抑制するには、出力を [void] に型キャストするか、Out-Nullにパイプ処理します。
$input.MoveNext() | Out-Null
[void]$input.MoveNext()
Reset
このメソッドは、列挙子を Reset 最初の位置である、コレクションの先頭の要素の 前 に設定します。
Current
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
呼び出すと、 変数がクリアされます。
- MoveNext
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 メソッドを自動的に呼び出しません。
Current MoveNextを明示に呼び出さない限り、プロパティは入力されません。 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 メソッドを使って値を変更します。
手記
foreach ループの各イテレーションは、MoveNext メソッドを自動的に呼び出します。
次のループは 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 hasn't changed: $num"
}
}
Iteration: 0
Num: one
Current: one
Iteration: 1
Num: two
Current: two
Before MoveNext (Current): two
After MoveNext (Current): three
Num hasn't changed: two
Reset メソッドを使用すると、コレクション内の現在の要素がリセットされます。 次の例では、 メソッドが呼び出されるため、最初の 2 つの要素 Reset ループします。 最初の 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()
("`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 変数とまったく同じ規則があります。 次の例では、すべての列挙子の概念を示します。
手記
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
こちらも参照ください
PowerShell