about_Automatic_Variables
简短说明
介绍存储 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。 分析错误不会导致执行,因此它们不会影响值 $?
。
对于在管道中的多个阶段运行的 cmdlet 和高级函数,例如,在 process
和 end
块中,在任何点分别调用 this.WriteError()
或 $PSCmdlet.WriteError()
会将 $?
设置为 False,this.ThrowTerminatingError()
和 $PSCmdlet.ThrowTerminatingError()
也一样。
Write-Error
cmdlet 始终在执行后立即将 $?
设置为 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()
。
对于本机命令(可执行文件),当 $LASTEXITCODE
为 0 时,$?
设置为 True,当 $LASTEXITCODE
为任何其他值时设置为 False。
注意
在 PowerShell 7 之前,在括号 (...)
、子表达式语法 $(...)
或数组表达式 @(...)
中包装语句始终 reset$?
为 True。 例如,(Write-Error)
将 $?
显示为 True。 此行为在 PowerShell 7 中发生了更改,因此 $?
始终反映这些表达式中最后一个命令运行的实际成功。
$^
包含会话收到的最后一行中的第一个令牌。
$_
与 $PSItem
相同。 包含 current 管道对象中的对象。 可以在对管道中每个对象执行操作的命令中使用此变量。
有关详细信息,请参阅 about_PSItem。
$args
包含传递给函数、脚本或脚本块的未声明参数的值数组。 创建函数时,可以使用 param
关键字声明参数,也可以在函数名称后面添加以逗号分隔的参数列表。
在事件操作中,$args
变量包含表示正在处理的事件的事件参数的对象。 此变量仅在事件注册命令的 Action
块内填充。 也可以在返回对象的 Get-Event
PSEventArgs SourceArgs 属性中找到此变量的值。
$ConsoleFileName
包含最近在会话中使用的控制台文件 (.psc1
) 的路径。 当使用 PSConsoleFile 参数启动 PowerShell 时或使用 Export-Console
cmdlet 将管理单元名称导出到控制台文件时,将填充此变量。
使用不带参数的 Export-Console
cmdlet 时,它会自动更新会话中最近使用的控制台文件。 可以使用此自动变量来确定要更新的文件。
$EnabledExperimentalFeatures
包含已启用的试验性功能的名称列表。
Error$
包含表示最新错误的错误对象的数组。 最近的错误是数组中的第一个对象 $Error[0]
。
若要防止将错误添加到 $Error
数组,请使用值为 Ignore 的 ErrorAction 通用参数。 有关详细信息,请参阅 about_CommonParameters。
$Event
包含一个 PSEventArgs 对象,该对象表示正在处理的事件。 此变量仅在事件注册命令的 Action
块中填充,例如 Register-ObjectEvent
。 此变量的值与 Get-Event
cmdlet 返回的对象相同。 可以在 Action
脚本块中使用 Event
变量的属性,例如 $Event.TimeGenerated
。
$EventArgs
包含一个对象,该对象表示从正在处理的事件的 EventArgs 派生的第一个事件参数。 此变量仅在事件注册命令的 Action
块内填充。 也可以在返回对象的 Get-Event
PSEventArgs SourceEventArgs 属性中找到此变量的值。
$EventSubscriber
包含一个 PSEventSubscriber 对象,该对象表示正在处理的事件的事件订阅服务器。 此变量仅在事件注册命令的 Action
块内填充。 此变量的值与 Get-EventSubscriber
cmdlet 返回的对象相同。
$ExecutionContext
包含一个 EngineIntrinsics 对象,该对象表示 PowerShell 主机的执行上下文。 可以使用此变量查找可用于 cmdlet 的执行对象。
$false
包含 False。 可以使用此变量在命令和脚本中表示 False,而不是使用字符串 "false"
。 如果字符串转换为非空字符串或非零整数,则可以将其解释为 True。
$foreach
包含 ForEach 循坏枚举器(而不是生成的值)。 $ForEach
变量仅在 ForEach
循环运行时存在;循环完成后,会将其删除。
枚举器包含可用于检索循环值和更改 current 循环迭代的属性和方法。 有关详细信息,请参阅使用枚举器。
$HOME
包含用户主目录的完整路径。 在 Windows 上,此变量使用 "$env:USERPROFILE"
Windows 环境变量的值,通常为 C:\Users\<UserName>
。 在 Unix 上,此变量使用 HOME
环境变量的值。
重要
Windows 可以重定向用户配置文件的位置。 这意味着 $HOME
的值可能与 "$env:HOMEDRIVE$env:HOMEPATH"
的值不同。
$Host
包含一个对象,该对象表示 PowerShell 的 current 主机应用程序。
可以使用此变量在命令中表示current主机,或者显示或更改主机的属性,例如$Host.version
或$Host.CurrentCulture
或。$Host.UI.RawUI.BackGroundColor = "Red"
注意
$Host.PrivateData
中的颜色设置已替换为 $PSStyle
首选项变量。 有关详细信息,请参阅 about_ANSI_Terminals。
输入*
包含枚举器,该枚举器枚举传递给函数的所有输入。
该 $input
变量仅适用于函数、脚本块(它们是未命名函数)和脚本文件(保存的脚本块)。
在没有
begin
、process
或end
块的函数中,$input
变量枚举函数的所有输入的集合。在
begin
块中,$input
变量不包含任何数据。在
process
块中,变量$input
包含 current 管道中的对象。在
end
块中,$input
变量枚举函数的所有输入的集合。注意
不能在同一函数或脚本块中使用
process
块和end
块内的$input
变量。
由于 $input
是枚举器,因此访问其任何属性会导致 $input
不再可用。 可以将 $input
存储在另一个变量中,以重复使用 $input
属性。
枚举器包含可用于检索循环值和更改 current 循环迭代的属性和方法。 有关详细信息,请参阅使用枚举器。
从命令行调用时,$input
变量也可用于由 pwsh
的 -Command
参数指定的命令。 以下示例从 Windows 命令 shell 运行。
echo Hello | pwsh -Command """$input World!"""
$IsCoreCLR
包含 $true
会话 current 是否在 .NET Core 运行时 (CoreCLR) 上运行。 否则包含 $false
。
$IsLinux
包含 $true
会话是否 current 在 Linux 操作系统上运行。
否则包含 $false
。
$IsMacOS
包含 $true
会话是否 current 在 MacOS 操作系统上运行。
否则包含 $false
。
$IsWindows
包含 $true
会话是否 current 在 Windows 操作系统上运行。 否则包含 $false
。
$LASTEXITCODE
包含运行的最后一个本机程序或 PowerShell 脚本的退出代码。
对于 PowerShell 脚本,$LASTEXITCODE
的值取决于如何调用脚本以及是否使用了 exit
关键字:
当脚本使用
exit
关键字时:$LASTEXITCODE
设置为由exit
关键字指定的值。 有关详细信息,请参阅 about_Language_Keywords。直接调用脚本(如
./Test.ps1
)或使用调用运算符 (&
),如& ./Test.ps1
:$LASTEXITCODE
的值不更改,除非:- 该脚本调用使用
exit
关键字的另一个脚本 - 脚本调用本机命令
- 该脚本使用
exit
关键字
- 该脚本调用使用
使用 File 参数通过
pwsh
调用脚本时,$LASTEXITCODE
设置为:- 如果脚本因异常而终止,则
1
- 由
exit
关键字指定的值(如果在脚本中使用) - 如果脚本成功完成,则
0
- 如果脚本因异常而终止,则
使用 Command 参数通过
pwsh
调用脚本时,$LASTEXITCODE
设置为:- 如果脚本因异常或最后一个命令集的结果将
$?
设置为$false
而终止,则1
- 脚本成功完成并且最后一个命令集的结果将
$?
设置为$true
,则0
- 如果脚本因异常或最后一个命令集的结果将
有关 File 和 Command 参数的详细信息,请参阅 about_Pwsh。
$Matches
$Matches
变量适用于 -match
和 -notmatch
运算符。 向或运算符提交标量输入-match
时,两者都检测到匹配项,返回布尔值,并使用匹配的任何字符串值的哈希表填充$Matches
自动-notmatch
变量。 将正则表达式与 -match
运算符一起使用时,也可以使用捕获填充 $Matches
哈希表。
有关 -match
运算符的详细信息,请参阅 about_Comparison_Operators。 有关正则表达式的详细信息,请参阅 about_Regular_Expressions。
$Matches
变量也适用于具有 -Regex
参数的 switch
语句。 其填充方式与 -match
和 -notmatch
运算符相同。 有关 switch
语句的详细信息,请参阅 about_Switch。
注意
在会话中填充 $Matches
时,它将保留匹配的值,直到被另一个匹配项覆盖。 如果 -match
再次使用且未找到任何匹配项,则不会 reset$Matches
使用该匹配 $null
项。 先前匹配的值将保留在 $Matches
中,直到找到另一个匹配项。
$MyInvocation
包含有关 current 命令的信息,例如名称、参数、参数值以及有关如何启动、调用或调用命令的信息,例如调用 current 命令的脚本的名称。
仅为脚本、函数和脚本块填充 $MyInvocation
。 可以使用在脚本中 返回的 System.Management.Automation.InvocationInfo 对象 $MyInvocation
中 current 的信息,例如函数的名称($MyInvocation.MyCommand.Name
)来标识 current 命令。
这对于查找脚本的名称 current 非常有用。
从 PowerShell 3.0 开始,MyInvocation
具有以下新属性。
- PSScriptRoot - 包含调用 current 命令的脚本的完整路径。 仅当调用方是脚本时,才会填充此属性的值。
- PSCommandPath - 包含调用 current 命令的脚本的完整路径和文件名。 仅当调用方是脚本时,才会填充此属性的值。
$PSScriptRoot
$PSCommandPath
与自动变量不同,自动变量的 $MyInvocation
PSScriptRoot 和 PSCommandPath 属性包含有关调用程序或调用脚本的信息,而不是current脚本。
$NestedPromptLevel
包含 current 提示级别。 值为 0 表示原始提示级别。 当你输入嵌套级别并在退出嵌套级别时,递减该值会递增。
例如,使用 $Host.EnterNestedPrompt
方法时,PowerShell 会提供嵌套命令提示符。 在 PowerShell 调试器中到达断点时,PowerShell 还会显示嵌套命令提示符。
输入嵌套提示时,PowerShell 会暂停 current 命令,保存执行上下文,并递增变量的值 $NestedPromptLevel
。 若要创建其他嵌套命令提示符(最多 128 个级别)或返回到原始命令提示符,请完成命令或键入 exit
。
$NestedPromptLevel
变量可帮助你跟踪提示级别。 可以创建包含此值的备用 PowerShell 命令提示符,使其始终可见。
$null
$null
是一个自动变量,其中包含 null 或空值。 可以使用此变量来表示命令和脚本中的缺失值或未定义值。
PowerShell 将 $null
视为具有值或占位符的对象,因此可以使用 $null
来表示值集合中的空值。
例如,$null
包含在集合中时,它被计为其中一个对象。
$a = "one", $null, "three"
$a.count
3
如果将 $null
变量通过管道传递给 ForEach-Object
cmdlet,它将为 $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
包含托管 current PowerShell 会话的进程的进程标识符(PID)。
$PROFILE
包含用户和current主机应用程序的 PowerShell 配置文件current的完整路径。 可以使用此变量来表示命令中的配置文件。 例如,可以在命令中使用它来确定是否已创建配置文件:
Test-Path $PROFILE
或者,可以在命令中使用它来创建配置文件:
New-Item -ItemType file -Path $PROFILE -Force
可以在命令中使用它在 notepad.exe 中打开配置文件:
notepad.exe $PROFILE
$PSBoundParameters
包含传递给脚本或函数及其 current 值的参数的字典。 此变量仅在声明参数的作用域(如脚本或函数)中具有值。 可以使用它来显示或更改 current 参数的值,或者将参数值传递给另一个脚本或函数。
在此示例中,Test2 函数将 $PSBoundParameters
传递给 Test1 函数。 $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
包含一个对象,该对象表示正在运行的 cmdlet 或高级函数。
可以在 cmdlet 或函数代码中使用对象的属性和方法来响应使用条件。 例如,ParameterSetName 属性包含正在使用的参数集的名称,ShouldProcess 方法将 WhatIf 和 Confirm 参数动态添加到 cmdlet。
有关 $PSCmdlet
自动变量的详细信息,请参阅 about_Functions_CmdletBindingAttribute 和 about_Functions_Advanced。
$PSCommandPath
包含正在运行的脚本的完整路径和文件名。 此参数在所有脚本中均有效。
$PSCulture
从 PowerShell 7 开始, $PSCulture
反映 PowerShell 运行空间(会话)的 current 区域性。 如果在 PowerShell 运行空间中更改区域性,则会更新该运行空间的 $PSCulture
值。
区域性确定项(如数字、货币和日期)的显示格式,并存储在 system.Globalization.CultureInfo 对象中。 使用 Get-Culture
显示计算机的区域性。 $PSCulture
包含 Name 属性值。
$PSDebugContext
调试时,此变量包含有关调试环境的信息。 否则它包含 null 值。 因此,可以使用它来确定调试器是否具有控制权。 填充后,它包含 PsDebugContext 对象,该对象具有 Breakpoints 和 InvocationInfo 属性。 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
与 $_
相同。 包含 current 管道对象中的对象。 可以在对管道中每个对象执行操作的命令中使用此变量。
有关详细信息,请参阅 about_PSItem。
$PSScriptRoot
包含执行脚本的父目录的完整路径。
在 PowerShell 2.0 中,此变量仅在脚本模块 (.psm1
) 中有效。
从 PowerShell 3.0 开始,它在所有脚本中均有效。
$PSSenderInfo
包含有关启动 PSSession 的用户的信息,包括用户标识和发起计算机的时区。 此变量仅在 PSSessions 中可用。
$PSSenderInfo
变量包括用户可配置的属性 ApplicationArguments,默认情况下,该属性仅包含来自发起会话的 $PSVersionTable
。 若要将数据添加到 ApplicationArguments 属性,请使用 New-PSSessionOption
cmdlet 的 ApplicationArguments 参数。
$PSUICulture
包含操作系统中配置的用户界面 (UI) 区域性的名称。 UI 区域性确定哪些文本字符串用于用户界面元素,例如菜单和消息。 这是系统的 System.Globalization.CultureInfo.CurrentUICulture.Name 属性的值。 若要获取系统的 System.Globalization.CultureInfo 对象,请使用 Get-UICulture
cmdlet。
$PSVersionTable
包含一个只读哈希表,该表显示有关在会话中 current 运行的 PowerShell 版本的详细信息。 该表包含以下项:
- PSVersion - PowerShell 版本号
- PSEdition 此属性在功能齐全的 Windows 版本中具有 PowerShell 4 及更低版本以及 PowerShell 5.1 的值。 此属性具有适用于 PowerShell 6 及更高版本以及 Windows PowerShell 5.1(如 Windows Nano Server 或 Windows IoT)的缩减版本
Core
的值。 - GitCommitId - GitHub 中源文件的提交 ID,
- OS - PowerShell 正在运行的操作系统的说明。
- Platform - 运行操作系统的平台。 Linux 和 macOS 上的值为 Unix。 请参见
$IsMacOs
和$IsLinux
。 - PSCompatibleVersions - 与 current 版本兼容的 PowerShell 版本
- PSRemotingProtocolVersion - PowerShell 远程管理协议的版本。
- SerializationVersion - 序列化方法的版本
- WSManStackVersion - WS 管理堆栈的版本号
$PWD
包含一个路径对象,该对象表示 PowerShell 运行空间的 current 目录位置 current 的完整路径。
注意
PowerShell 支持每个进程有多个运行空间。 每个 runspace 都有其自己的 current 目录。 这与进程的目录不同current: [System.Environment]::CurrentDirectory
$Sender
包含生成此事件的对象。 此变量仅在事件注册命令的操作块内填充。 也可以在返回对象的 PSEventArgs Get-Event
Sender 属性中找到此变量的值。
$ShellId
包含 shell 的 current 标识符。
$StackTrace
包含最新错误的堆栈跟踪。
$switch
包含枚举器,而不是 Switch
语句的结果值。 $switch
变量仅在 Switch
语句运行时存在;当 switch
语句完成执行时,会将其删除。 有关详细信息,请参阅 about_Switch。
枚举器包含可用于检索循环值和更改 current 循环迭代的属性和方法。 有关详细信息,请参阅使用枚举器。
$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。
.NET 事件类也使用 $this
变量,这些类将脚本块作为事件处理程序的委托。 在此方案中,$this
表示发起事件的对象,称为事件发送方。
$true
包含 True。 可以使用此变量在命令和脚本中表示 True。
使用枚举器
$input
、$foreach
和 $switch
变量都是枚举器,用于循环访问由它们包含的代码块处理的值。
枚举器包含可用于推进或 reset 迭代或检索迭代值的属性和方法。 直接操作枚举器并不被视为最佳做法。
在接受管道输入的函数中,最佳做法是将参数与 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 属性获取集合或管道 current 中位于枚举器位置的元素。
Current 属性将继续返回相同的属性,直到调用 MoveNext。
示例
示例 1:使用 $input 变量
在以下示例中,访问 $input
变量将清除该变量,直到下一次执行进程块为止。 Reset使用该方法将$input
变量重置为current管道值。
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 时, 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 属性访问 current 集合元素,并使用 Reset MoveNext 方法更改其值。
注意
foreach
循环的每个迭代都会自动调用 MoveNext 方法。
以下循环仅执行两次。 在第二次迭代中,集合在迭代完成之前移动到第三个元素。 第二次迭代后,现在不再有循环访问的值,循环将终止。
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使用该方法重置current集合中的元素。 下面的示例循环访问前两个元素两次,因为调用了 Reset 方法。 在前两个循环之后,if
语句失败,循环通常会循环访问所有三个元素。
重要
这可能会导致无限循环。
$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 事例永远不会执行,即使 MoveNext 方法之后没有 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