about_Automatic_Variables
簡単な説明
PowerShell で作成およびメイン状態情報を格納する変数について説明します。
概念的には、これらの変数のほとんどは読み取り専用と見なされます。 書き込み可能であっても、下位互換性のために書き込むべきではありません。
PowerShell の自動変数の一覧を次に示します。
- $$
- $?
- $^
- $_
- $args
- $ConsoleFileName
- $EnabledExperimentalFeatures
- $error
- $Event
- $EventArgs
- $EventSubscriber
- $ExecutionContext
- $false
- $foreach
- ホーム
- $Host
- $input
- $IsCoreCLR
- $IsLinux
- $IsMacOS
- $IsWindows
- $LASTEXITCODE
- $Matches
- $MyInvocation
- $NestedPromptLevel
- $null
- $PID
- $profile
- $PSBoundParameters
- $PSCmdlet
- $PSCommandPath
- $PSCulture
- $PSDebugContext
- $P Standard Edition表示
- $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()
に設定$?
されます)。同様です。
コマンドレットはWrite-Error
、実行された直後に常に False に設定$?
されますが、それを呼び出す関数では False に設定$?
されません。
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()
代わりに使用する必要があります。
ネイティブ コマンド (実行可能ファイル) $?
の場合、0 の場合$LASTEXITCODE
は True に設定され、他の値の場合$LASTEXITCODE
は False に設定されます。
Note
PowerShell 7 まで、かっこ(...)
内のステートメント、部分式構文$(...)
、または配列式@(...)
をラップすると、常に True にリセット$?
されます。 たとえば、 (Write-Error)
True と表示されます$?
。 この動作は PowerShell 7 で変更され $?
、これらの式での最後のコマンド実行の実際の成功が常に反映されます。
$^
セッションによって受信された最後の行の最初のトークンを格納します。
$_
$PSItem
と同じ。 パイプライン オブジェクト内の現在のオブジェクトを格納します。 この変数は、パイプライン内のすべてのオブジェクトに対してアクションを実行するコマンドで使用できます。
詳細については、「about_PSItem」を参照してください。
$args
関数、スクリプト、またはスクリプト ブロックに渡される宣言されていないパラメーターの値の配列を格納します。 関数を作成するときは、キーワード (keyword)を使用param
するか、関数名の後にかっこで囲まれたパラメーターのコンマ区切りのリストを追加して、パラメーターを宣言できます。
イベント アクションでは、 $args
変数には、処理中のイベントのイベント引数を表すオブジェクトが含まれます。 この変数は、イベント登録コマンドの Action
ブロック内でのみ設定されます。 この変数の値は、返される P Standard Edition ventArgs オブジェクトの SourceArgs プロパティにも含Get-Event
まれています。
$ConsoleFileName
セッションで最後に使用されたコンソール ファイル (.psc1
) のパスを格納します。 この変数は、PSConsoleFile パラメーターを使用して PowerShell を起動するとき、またはコマンドレットをExport-Console
使用してスナップイン名をコンソール ファイルにエクスポートするときに設定されます。
パラメーターを指定せずにコマンドレットを Export-Console
使用すると、セッションで最後に使用されたコンソール ファイルが自動的に更新されます。 この自動変数を使用して、更新するファイルを決定できます。
$EnabledExperimentalFeatures
有効になっている実験用機能の名前の一覧が含まれます。
Error$
最新のエラーを表すエラー オブジェクトの配列が含まれています。 最新のエラーは、配列 $Error[0]
内の最初のエラー オブジェクトです。
エラーが配列に$Error
追加されないようにするには、ErrorAction 共通パラメーターを使用し、値を Ignore にします。 詳細については、「about_CommonParameters」を参照してください。
$Event
処理中のイベントを表す P Standard Edition ventArgs オブジェクトを格納します。 この変数は、イベント登録コマンドRegister-ObjectEvent
のブロック内Action
でのみ設定されます。 この変数の値は、コマンドレットが返すのと Get-Event
同じオブジェクトです。 変数の Event
プロパティ (スクリプト ブロック内など $Event.TimeGenerated
) を Action
使用できます。
$EventArgs
処理中のイベントの EventArgs から派生する最初のイベント引数を表すオブジェクトを格納します。 この変数は、イベント登録コマンドの Action
ブロック内でのみ設定されます。 この変数の値は、返される P Standard Edition ventArgs オブジェクトの SourceEventArgs プロパティにも見Get-Event
つかります。
$EventSubscriber
処理中のイベントのイベント サブスクライバーを表す P Standard Edition ventSubscriber オブジェクトを格納します。 この変数は、イベント登録コマンドの Action
ブロック内でのみ設定されます。 この変数の値は、コマンドレットが返すのと Get-EventSubscriber
同じオブジェクトです。
$ExecutionContext
PowerShell ホストの 実行コンテキストを表す EngineIntrinsics オブジェクトを格納します。 この変数を使用して、コマンドレットで使用できる実行オブジェクトを見つけることができます。
$false
False を含みます。 この変数を使用すると、文字列"false"
を使用する代わりに、コマンドとスクリプトで False を表すことができます。 空でない文字列または 0 以外の整数に変換される場合、文字列は True と解釈できます。
$foreach
ForEach ループの列挙子 (結果の値ではない) を格納します。 変数は $ForEach
、ループの ForEach
実行中にのみ存在し、ループの完了後に削除されます。
列挙子には、ループ値を取得し、現在のループイテレーションを変更するために使用できるプロパティとメソッドが含まれています。 詳細については、「列挙子の使用」を参照してください。
ホーム
ユーザーのホーム ディレクトリの完全なパスが含まれています。 Windows では、この変数は Windows 環境変数の値を "$env:USERPROFILE"
使用します。通常 C:\Users\<UserName>
は > Unix では、この変数は環境変数の値を HOME
使用します。
重要
Windows では、ユーザーのプロファイルの場所をリダイレクトできます。 これは、同 $HOME
じ値 "$env:HOMEDRIVE$env:HOMEPATH"
を持たない可能性があることを意味します.
$Host
PowerShell の現在のホスト アプリケーションを表すオブジェクトを格納します。
この変数を使用すると、コマンドで現在のホストを表したり、$Host.version
ホストのプロパティを表示または変更したりできます $Host.UI.RawUI.BackGroundColor = "Red"
(例: または $Host.CurrentCulture
.
Note
の色設定 $Host.PrivateData
は、基本設定変数に $PSStyle
置き換えられました。 詳細については、「about_ANSI_Terminals」を参照してください。
$input
関数に渡されるすべての入力を列挙する列挙子を格納します。
変数は $input
、関数、スクリプト ブロック (名前のない関数)、スクリプト ファイル (保存されたスクリプト ブロック) でのみ使用できます。
、または
end
ブロックのないbegin
process
関数では、変数は$input
関数へのすべての入力のコレクションを列挙します。ブロックでは
begin
、変数に$input
データが含まれています。ブロック内
process
の$input
変数には、パイプライン内の現在のオブジェクトが含まれています。ブロックでは
end
、変数は$input
関数へのすべての入力のコレクションを列挙します。Note
同じ関数またはスクリプト ブロック内の
process
ブロックとブロックのend
両方の内部で変数を使用$input
することはできません。
列挙子であるため $input
、プロパティのいずれかにアクセスすると $input
使用できなくなります。 プロパティを再利用するために、別の変数に$input
格納$input
できます。
列挙子には、ループ値を取得し、現在のループイテレーションを変更するために使用できるプロパティとメソッドが含まれています。 詳細については、「列挙子の使用」を参照してください。
変数は$input
、コマンド ラインから呼び出されたときのpwsh
パラメーターで-Command
指定されたコマンドでも使用できます。 次の例は、Windows コマンド シェルから実行されます。
echo Hello | pwsh -Command """$input World!"""
$IsCoreCLR
現在の $True
セッションが .NET Core ランタイム (CoreCLR) で実行されているかどうかを格納します。 それ以外の場合は .$False
$IsLinux
現在の $True
セッションが Linux オペレーティング システムで実行されているかどうかを格納します。
それ以外の場合は .$False
$IsMacOS
現在の $True
セッションが MacOS オペレーティング システムで実行されているかどうかを示します。
それ以外の場合は .$False
$IsWindows
現在の $TRUE
セッションが Windows オペレーティング システムで実行されているかどうかを示します。 それ以外の場合は .$FALSE
$LASTEXITCODE
最後に実行されたネイティブ プログラムまたは PowerShell スクリプトの終了コードが含まれます。
PowerShell スクリプトの場合、値はスクリプトの$LASTEXITCODE
呼び出し方法と、キーワード (keyword)がexit
使用されたかどうかによって異なります。
スクリプトでキーワード (keyword)を使用する
exit
場合:$LASTEXITCODE
は、キーワード (keyword)で指定された値にexit
設定されます。 詳細については、「about_Language_Keywords」を参照してください。スクリプトが直接呼び出されたとき、または
./Test.ps1
呼び出し演算子 (&
) を使用して次のように& ./Test.ps1
呼び出される場合:の
$LASTEXITCODE
値は、次の場合を除き変更されません。- スクリプトは、キーワード (keyword)を使用する別のスクリプトを
exit
呼び出します - スクリプトはネイティブ コマンドを呼び出します
- スクリプトでは、キーワード (keyword)を使用します
exit
- スクリプトは、キーワード (keyword)を使用する別のスクリプトを
File パラメーターを使用してスクリプトを呼び出
pwsh
すと、$LASTEXITCODE
次の値に設定されます。1
例外が原因でスクリプトが終了した場合- スクリプトで使用する場合は
exit
、キーワード (keyword)で指定された値 0
スクリプトが正常に完了した場合
Command パラメーターを使用してスクリプトを呼び出
pwsh
すと、$LASTEXITCODE
次の値が設定されます。1
例外が原因でスクリプトが終了した場合、または最後のコマンド$?
の結果が$false
0
スクリプトが正常に完了し、最後のコマンド$?
の結果が$true
File パラメーターと Command パラメーターの詳細については、「about_Pwsh」を参照してください。
$Matches
変数は $Matches
and 演算子で-match
-notmatch
動作します。 スカラー入力を or -notmatch
演算子に-match
送信し、いずれかの演算子が一致を検出すると、ブール値が返され、一致した文字列値のハッシュ テーブルが自動変数に設定$Matches
されます。 $Matches
演算子で正規表現を使用する場合は、ハッシュ テーブルにキャプチャを-match
設定することもできます。
演算子の-match
詳細については、about_Comparison_Operatorsを参照してください。 正規表現の詳細については、「about_Regular_Expressions」を参照してください。
変数は $Matches
、パラメーターを持 switch
つ -Regex
ステートメントでも機能します。 これは、演算子と-notmatch
同じ方法で-match
設定されます。 ステートメントの詳細switch
については、about_Switchを参照してください。
Note
$Matches
セッションにデータが入力されると、一致した値は、別の一致によって上書きされるまで保持されます。 再び使用され、一致するものが見つからない場合-match
は、次に$null
リセット$Matches
されません。 以前に一致した値は、別の $Matches
一致が見つかるまで保持されます。
$MyInvocation
現在のコマンドに関する情報 (名前、パラメーター、パラメーター値など) と、コマンドの起動、呼び出し、呼び出し方法に関する情報 (現在のコマンドを呼び出したスクリプトの名前など) が含まれます。
$MyInvocation
は、スクリプト、関数、およびスクリプト ブロックに対してのみ設定されます。 現在のコマンドを識別する関数 ($MyInvocation.MyCommand.Name
) の名前など、現在のスクリプトで返される $MyInvocation
System.Management.Automation.InvocationInfo オブジェクトの情報を使用できます。
これは、現在のスクリプトの名前を見つけるのに役立ちます。
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
コマンドレットに変数を$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 関数が 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_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 プロパティは、デバッグ対象のスクリプトのパスを示します。
$P Standard Edition表示
に同じ値が $PSVersionTable.PSEdition
含まれています。 この変数はモジュール マニフェスト ファイルで使用できますが $PSVersionTable
、使用できません。
$PSHOME
通常 C:\Program Files\PowerShell\7
、Windows システムの PowerShell のインストール ディレクトリの完全なパスが含まれています。 この変数は、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 でのみ使用できます。
この $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 のバージョン番号
- P Standard Edition dition このプロパティの値は、PowerShell 4 以下の場合は 'Desktop' であり、フル機能の Windows エディションでは PowerShell 5.1 です。 このプロパティの値は、Windows Nano Server や Windows IoT などのフットプリントが小さいエディションでは、PowerShell 6 以降と Windows PowerShell 5.1 の値
Core
になります。 - GitCommitId - GitHub のソース ファイルのコミット ID。
- OS - PowerShell が実行されているオペレーティング システムの説明。
- プラットフォーム - オペレーティング システムが実行されているプラットフォーム。 Linux と macOS の値は Unix です。
$IsMacOs
と$IsLinux
を参照してください。 - PSCompatibleVersions - 現在のバージョンと互換性のある PowerShell のバージョン
- PSRemotingProtocolVersion - PowerShell リモート管理プロトコルのバージョン。
- SerializationVersion - シリアル化メソッドのバージョン
- WSManStackVersion - WS-Management スタックのバージョン番号
$PWD
現在の PowerShell 実行空間の現在のディレクトリの場所の完全なパスを表すパス オブジェクトを格納します。
Note
PowerShell では、プロセスごとに複数の実行空間がサポートされます。 各実行空間には、独自 の現在のディレクトリがあります。 これは、プロセス [System.Environment]::CurrentDirectory
の現在のディレクトリと同じではありません。
$Sender
このイベントを生成したオブジェクトを格納します。 この変数は、イベント登録コマンドの Action ブロック内でのみ設定されます。 この変数の値は、返される P Standard Edition ventArgs オブジェクトの 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
Contains True。 この変数を使用すると、コマンドとスクリプトで True を表すことができます。
列挙子の使用
$input
、$foreach
および$switch
変数は、すべての列挙子を使用して、含まれるコード ブロックによって処理される値を反復処理します。
列挙子には、反復を進めたりリセットしたり、反復値を取得したりするために使用できるプロパティとメソッドが含まれています。 列挙子を直接操作することはベスト プラクティスとは見なされません。
ループ内では、フロー制御キーワード (keyword)中断して続行することをお勧めします。
パイプライン入力を受け入れる関数内では、ValueFromPipeline 属性または ValueFromPipelineByPropertyName 属性でパラメーターを使用することをお勧めします。
詳細については、「about_Functions_Advanced_Parameters」を参照してください。
MoveNext
MoveNext メソッドは、列挙子をコレクションの次の要素に進めます。 列挙子がコレクションのTrue
末尾を通過した場合、列挙子が正常に拡張された場合、 False
MoveNext が返されます。
Note
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
。
- 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 メソッドを自動的に呼び出しません。
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 メソッドを使用してその値を変更します。
Note
ループの各イテレーションは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 回ループします。 最初の 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
。 次の例では、すべての列挙子の概念を示します。
Note
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
関連項目
PowerShell
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示