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, если она завершилась ошибкой. Ошибки синтаксического анализа не приводят к выполнению, поэтому они не влияют на значение $?
.
Для командлетов и расширенных функций, выполняемых на нескольких этапах в конвейере, например в обоих блоках, вызов $PSCmdlet.WriteError()
this.WriteError()
или соответственно в любой точке имеет $?
значение False, как и $PSCmdlet.ThrowTerminatingError()
this.ThrowTerminatingError()
.process
end
Командлет 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()
следует использовать вместо этого.
Для собственных команд (исполняемых файлов) $?
задано значение True, если $LASTEXITCODE
значение равно 0, и при наличии любого другого значения задано значение False$LASTEXITCODE
.
Примечание.
Пока PowerShell 7 не будет упаковать инструкцию в скобки, синтаксис $(...)
вложенных выражений или выражение @(...)
массива всегда$?
resetв значение True.(...)
Например, (Write-Error)
отображается $?
значение True. Это поведение изменилось в PowerShell 7, поэтому $?
всегда отражает фактическое успешное выполнение последней команды в этих выражениях.
$^
Содержит первый маркер в последней строке, полученной сеансом.
$_
Эквивалентно $PSItem
. Содержит current объект в объекте конвейера. Эту переменную можно использовать в командах, выполняющих действие для каждого объекта в конвейере.
Дополнительные сведения см. в about_PSItem.
$args
Содержит массив значений для необъявленных параметров, передаваемых в функцию, скрипт или блок скрипта. При создании функции можно объявить параметры с param
ключевым словом или добавить разделенный запятыми список параметров в скобках после имени функции.
В действии $args
события переменная содержит объекты, представляющие аргументы события обрабатываемого события. Эта переменная заполняется только в Action
блоке команды регистрации событий. Значение этой переменной также можно найти в свойстве SourceArgs объекта, возвращаемого PSEventArgs Get-Event
.
$ConsoleFileName
Содержит путь к файлу консоли (.psc1
), который был недавно использован в сеансе. Эта переменная заполняется при запуске PowerShell с параметром PSConsoleFile или при экспорте имен оснастки в файл консоли с помощью 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
блоке команды регистрации событий. Значение этой переменной также можно найти в свойстве SourceEventArgs объекта, возвращаемого PSEventArgs Get-Event
.
$EventSubscriber
Содержит PSEventSubscriber объект, представляющий подписчик события обрабатываемого события. Эта переменная заполняется только в Action
блоке команды регистрации событий. Значение этой переменной является тем же объектом, что и возвращаемый командлетом Get-EventSubscriber
.
$ExecutionContext
Содержит объект EngineIntrinsics , представляющий контекст выполнения узла PowerShell. Эту переменную можно использовать для поиска объектов выполнения, доступных командлетам.
$false
Содержит false. Эту переменную можно использовать для представления false в командах и сценариях вместо использования строки "false"
. Строка может быть интерпретирована как True , если она преобразуется в непустую строку или в целое число, отличное от нуля.
$foreach
Содержит перечислитель (а не полученные значения) цикла ForEach . Переменная $ForEach
существует только во время ForEach
выполнения цикла; она удаляется после завершения цикла.
Перечислители содержат свойства и методы, которые можно использовать для получения значений current цикла и изменения итерации цикла. Дополнительные сведения см. в разделе "Использование перечислителей".
$HOME
Содержит полный путь к домашнему каталогу пользователя. В Windows эта переменная обычно использует значение переменной "$env:USERPROFILE"
C:\Users\<UserName>
среды Windows. В Unix эта переменная использует значение переменной HOME
среды.
Внимание
Windows может перенаправить расположение профиля пользователя. Это означает, что $HOME
может не совпадать со значением "$env:HOMEDRIVE$env:HOMEPATH"
.
$Host
Содержит объект, представляющий current хост-приложение для PowerShell.
Эту переменную можно использовать для представления current узла в командах или отображения или изменения свойств узла, например $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
переменная содержит current объект в конвейере.В блоке
end
$input
переменная перечисляет коллекцию всех входных данных функции.Примечание.
Переменную нельзя использовать
$input
как внутри блока, такprocess
иend
блока в одном блоке функции или скрипта.
Так как $input
это перечислитель, доступ к любому из его свойств больше $input
недоступен. Для повторного использования свойств можно сохранить $input
в другой переменной $input
.
Перечислители содержат свойства и методы, которые можно использовать для получения значений current цикла и изменения итерации цикла. Дополнительные сведения см. в разделе "Использование перечислителей".
Переменная $input
также доступна команде, указанной -Command
параметром pwsh
при вызове из командной строки. Следующий пример выполняется из командной оболочки Windows.
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
слово
- Скрипт вызывает другой сценарий, использующий ключевое
При вызове скрипта с
pwsh
помощью параметра$LASTEXITCODE
File задано следующее:1
Значение- Значение, указанное ключевым словом
exit
, если используется в скрипте 0
Если скрипт выполнен успешно
При вызове скрипта с
pwsh
помощью параметра$LASTEXITCODE
Command задано следующее:1
Значение$? в $false
0
Значение$? $true
Дополнительные сведения о параметрах файлов и команд см. в about_Pwsh.
$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
используется снова, и совпадение не найдено, оно не 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
переменных, свойства PSScriptRoot и PSCommandPath автоматической $MyInvocation
переменной содержат сведения о вызывающем или вызывающем скрипте, а не скриптеcurrent.$PSCommandPath
$NestedPromptLevel
Содержит current уровень запроса. Значение 0 указывает исходный уровень запроса. Значение увеличивается при вводе вложенного уровня и уменьшения при выходе из него.
Например, PowerShell представляет вложенную командную строку при использовании $Host.EnterNestedPrompt
метода. 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
передана командлету, она создает значение для $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
Содержит идентификатор процесса (PID) процесса, на котором размещен current сеанс PowerShell.
$PROFILE
Содержит полный путь профиля PowerShell для current пользователя и 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
Содержит объект, представляющий командлет или расширенную функцию, выполняемую.
Свойства и методы объекта в коде командлета или функции можно использовать для реагирования на условия использования. Например, свойство ParameterSetName содержит имя используемого набора параметров, а метод ShouldProcess добавляет параметры WhatIf и Confirm в командлет динамически.
Дополнительные сведения об автоматической переменной $PSCmdlet
см. в about_Functions_CmdletBindingAttribute и about_Functions_Advanced.
$PSCommandPath
Содержит полный путь и имя файла выполняемого скрипта. Эта переменная допустима во всех сценариях.
$PSCulture
Начиная с PowerShell 7, $PSCulture
отражает язык и региональные current параметры пространства выполнения PowerShell (сеанс). Если язык и региональные параметры изменяются в пространстве выполнения PowerShell, $PSCulture
значение для этого пространства выполнения обновляется.
Язык и региональные параметры определяют формат отображения таких элементов, как числа, валюта и даты, и хранится в объекте System.Globalization.CultureInfo . Используется Get-Culture
для отображения языка и региональных параметров компьютера. $PSCulture
содержит значение свойства Name .
$PSDebugContext
При отладке эта переменная содержит сведения о среде отладки. В противном случае он содержит значение NULL . В результате его можно использовать для определения того, имеет ли отладчик элемент управления. При заполнении он содержит объект PsDebugContext с точками останова и свойствами InvocationInfo. Свойство InvocationInfo имеет несколько полезных свойств, включая свойство Location . Свойство Location указывает путь к скрипту, который выполняется отладка.
$PSEdition
Содержит то же значение в $PSVersionTable.PSEdition
. Эта переменная доступна для использования в файлах $PSVersionTable
манифеста модуля, в то время как это не так.
$PSHOME
Содержит полный путь к каталогу установки Для PowerShell, как правило, C:\Program Files\PowerShell\7
в системах Windows. Эту переменную можно использовать в путях файлов PowerShell. Например, следующая команда выполняет поиск в концептуальных разделах справки по слову Help:
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, используйте параметр ApplicationArguments командлетаNew-PSSessionOption
.
$PSUICulture
Содержит имя языка и региональных параметров пользовательского интерфейса, настроенных в операционной системе. Язык и региональные параметры пользовательского интерфейса определяют, какие строки текста используются для элементов пользовательского интерфейса, например меню и сообщений. Это значение свойства System.Globalization.CultureInfo.CurrentUICulture.Name системы. Чтобы получить объект System.Globalization.CultureInfo для системы, используйте Get-UICulture
командлет.
$PSVersionTable
Содержит хэш-таблицу только для чтения, которая отображает сведения о версии PowerShell, работающей в сеансе current . Таблица содержит следующие элементы:
- PSVersion — номер версии PowerShell
- PSEdition Это свойство имеет значение Desktop для PowerShell 4 и ниже, а также PowerShell 5.1 в полнофункционированных выпусках Windows. Это свойство имеет значение
Core
для PowerShell 6 и более поздних версий, а также Windows PowerShell 5.1 для выпусков с ограниченным объемом памяти, таких как Windows Nano Server или Windows IoT. - GitCommitId — идентификатор фиксации исходных файлов в GitHub.
- ОС — описание операционной системы, в которую работает PowerShell.
- Платформа — платформа , на которую работает операционная система. Значение в Linux и macOS — Unix. Ознакомьтесь с разделами
$IsMacOs
и$IsLinux
. - PSCompatibleVersions — версии PowerShell, совместимые с current версией
- PSRemotingProtocolVersion — версия протокола удаленного управления PowerShell.
- SerializationVersion — версия метода сериализации
- WSManStackVersion — номер версии стека WS-Management
$PWD
Содержит объект пути, представляющий полный путь к расположению current каталога для current пространства выполнения PowerShell.
Примечание.
PowerShell поддерживает несколько пространств выполнения для каждого процесса. Каждое пространство runspace имеет собственный current каталог. Это не так же, как current каталог процесса: [System.Environment]::CurrentDirectory
$Sender
Содержит объект, создающий это событие. Эта переменная заполняется только в блоке действий команды регистрации событий. Значение этой переменной также можно найти в свойстве Sender объекта, возвращаемого PSEventArgs Get-Event
.
$ShellId
Содержит идентификатор оболочки 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.
В классе $this
PowerShell переменная ссылается на объект экземпляра самого класса, разрешая доступ к свойствам и методам, определенным в классе. Дополнительные сведения см. в статье About Classes and Desired State Configuration (О классах и настройке требуемого состояния).
Переменная $this
также используется классами событий .NET, которые принимают блоки скриптов в качестве делегатов обработчика событий. В этом сценарии $this
представляет объект, отправляющий событие, известный как отправитель событий.
$true
Содержит значение True. Эту переменную можно использовать для представления True в командах и сценариях.
Использование перечислителей
$foreach
Переменные $input
и $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 автоматически.
Свойство 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 Используйте свойство для доступа к элементу 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 никогда не выполняется, даже если break
после метода MoveNext нет инструкции.
$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