about_Automatic_Variables

Kort beskrivning

Beskriver variabler som lagrar tillståndsinformation för och skapas och underhålls av PowerShell.

Konceptuellt anses de flesta av dessa variabler vara skrivskyddade. Även om de kan skrivas till, för bakåtkompatibilitet bör de inte skrivas till.

Här är en lista över de automatiska variablerna i PowerShell:

Lång beskrivning

$$

Innehåller den sista token på den sista raden som togs emot av sessionen.

$?

Innehåller körningsstatusen för det senaste kommandot. Den innehåller Sant om det senaste kommandot lyckades och False om det misslyckades. Parsningsfel resulterar inte i körning, så de påverkar inte värdet $?för .

För cmdletar och avancerade funktioner som körs i flera steg i en pipeline, till exempel i både process och end block, anropar this.WriteError() eller $PSCmdlet.WriteError() vid någon tidpunkt anges $? till False, precis som this.ThrowTerminatingError() och $PSCmdlet.ThrowTerminatingError().

Cmdleten Write-Error anges $? alltid till False omedelbart efter att den har körts, men anges $? inte till False för en funktion som anropar den:

function Test-WriteError
{
    Write-Error "Bad"
    "The `$? variable is: $?"
}

Test-WriteError
"Now the `$? variable is: $?"
Test-WriteError : Bad
At line:7 char:1
+ Test-WriteError
+ ~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Test-WriteError

The $? variable is: False
Now the $? variable is: True

För det senare ändamålet $PSCmdlet.WriteError() bör användas i stället.

För inbyggda kommandon (körbara filer) $? anges till Sant när $LASTEXITCODE är 0 och anges till False när $LASTEXITCODE är något annat värde.

Kommentar

Fram till PowerShell 7 omsluter du en instruktion inom parenteser (...), underuttryckssyntax $(...)eller ett matrisuttryck @(...) alltid reset$? till Sant. Till (Write-Error) exempel visas $? som Sant. Det här beteendet ändrades i PowerShell 7, så det återspeglar alltid den $? faktiska framgången för den senaste kommandokörningen i dessa uttryck.

$^

Innehåller den första token på den sista raden som togs emot av sessionen.

$_

Samma som $PSItem. Innehåller objektet current i pipelineobjektet. Du kan använda den här variabeln i kommandon som utför en åtgärd på varje objekt i en pipeline.

Mer information finns i about_PSItem.

$args

Innehåller en matris med värden för odeklarerade parametrar som skickas till en funktion, ett skript eller ett skriptblock. När du skapar en funktion kan du deklarera parametrarna med nyckelordet param eller genom att lägga till en kommaavgränsad lista med parametrar inom parenteser efter funktionsnamnet.

I en händelseåtgärd innehåller variabeln $args objekt som representerar händelseargumenten för händelsen som bearbetas. Den här variabeln fylls endast i i blocket för Action ett händelseregistreringskommando. Värdet för den här variabeln finns också i egenskapen SourceArgs för objektet PSEventArgs som Get-Event returneras.

$ConsoleFileName

Innehåller sökvägen till den konsolfil (.psc1) som senast användes i sessionen. Den här variabeln fylls i när du startar PowerShell med parametern PSConsoleFile eller när du använder cmdleten Export-Console för att exportera snapin-namn till en konsolfil.

När du använder cmdleten Export-Console utan parametrar uppdateras automatiskt konsolfilen som senast användes i sessionen. Du kan använda den här automatiska variabeln för att fastställa vilken fil som ska uppdateras.

$Error

Innehåller en matris med felobjekt som representerar de senaste felen. Det senaste felet är det första felobjektet i matrisen $Error[0].

Om du vill förhindra att ett fel läggs till i matrisen $Error använder du den vanliga parametern ErrorAction med värdet Ignorera. Mer information finns i about_CommonParameters.

$Event

Innehåller ett PSEventArgs objekt som representerar händelsen som bearbetas. Den här variabeln fylls endast i i blocket för Action ett händelseregistreringskommando, till exempel Register-ObjectEvent. Värdet för den här variabeln är samma objekt som cmdleten Get-Event returnerar. Du kan använda egenskaperna för variabeln Event , till exempel $Event.TimeGenerated, i ett Action skriptblock.

$EventArgs

Innehåller ett objekt som representerar det första händelseargumentet som härleds från EventArgs för händelsen som bearbetas. Den här variabeln fylls endast i i blocket för Action ett händelseregistreringskommando. Värdet för den här variabeln finns också i egenskapen SourceEventArgs för objektet PSEventArgs som Get-Event returneras.

$EventSubscriber

Innehåller ett PSEventSubscriber objekt som representerar händelseprenumeranten för händelsen som bearbetas. Den här variabeln fylls endast i i blocket för Action ett händelseregistreringskommando. Värdet för den här variabeln är samma objekt som cmdleten Get-EventSubscriber returnerar.

$ExecutionContext

Innehåller ett EngineIntrinsics-objekt som representerar körningskontexten för PowerShell-värden. Du kan använda den här variabeln för att hitta körningsobjekt som är tillgängliga för cmdletar.

$false

Innehåller False. Du kan använda den här variabeln för att representera False i kommandon och skript i stället för att använda strängen "false". Strängen kan tolkas som True om den konverteras till en icke-tom sträng eller till ett heltal som inte är noll.

$foreach

Innehåller uppräknaren (inte de resulterande värdena) i en ForEach-loop . Variabeln finns bara när loopen ForEach körs. Den $ForEach tas bort när loopen har slutförts.

Uppräknare innehåller egenskaper och metoder som du kan använda för att hämta loopvärden och ändra loop-iterationen current . Mer information finns i Använda uppräknare.

$HOME

Innehåller den fullständiga sökvägen till användarens hemkatalog. Den här variabeln använder värdet för "$env:USERPROFILE" Windows-miljövariabeln, vanligtvis C:\Users\<UserName>.

Viktigt!

Windows kan omdirigera platsen för användarens profil. Det innebär att $HOME det kanske inte har samma värde som "$env:HOMEDRIVE$env:HOMEPATH".

$Host

Innehåller ett objekt som representerar current värdprogrammet för PowerShell. Du kan använda den här variabeln för att representera current värden i kommandon eller för att visa eller ändra värdens egenskaper, till exempel $Host.version eller $Host.CurrentCulture, eller $Host.UI.RawUI.BackGroundColor = "Red".

$input

Innehåller en uppräknare som räknar upp alla indata som skickas till en funktion. Variabeln $input är endast tillgänglig för funktioner, skriptblock (som är namnlösa funktioner) och skriptfiler (som är sparade skriptblock).

  • I en funktion utan ett begin, processeller end -block räknar variabeln $input upp samlingen av alla indata till funktionen.

  • I blocket begin innehåller variabeln $input inga data.

  • process I blocket innehåller current variabeln $input objektet i pipelinen.

  • end I blocket räknar variabeln $input upp samlingen med alla indata till funktionen.

    Kommentar

    Du kan inte använda variabeln $input i både process blocket och end blocket i samma funktion eller skriptblock.

Eftersom $input är en uppräknare blir $input åtkomst till någon av dess egenskaper inte längre tillgänglig. Du kan lagra $input i en annan variabel för att återanvända $input egenskaperna.

Uppräknare innehåller egenskaper och metoder som du kan använda för att hämta loopvärden och ändra loop-iterationen current . Mer information finns i Använda uppräknare.

Variabeln $input är också tillgänglig för kommandot som anges av parametern -Command powershell.exe för när den anropas från kommandoraden. Följande exempel körs från Windows-kommandogränssnittet.

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

$LASTEXITCODE

Innehåller slutkoden för det senaste interna programmet eller PowerShell-skriptet som kördes.

För PowerShell-skript beror värdet $LASTEXITCODE på hur skriptet anropades och om nyckelordet exit användes:

  • När ett skript använder nyckelordet exit :

    $LASTEXITCODE anges till värdet som anges av nyckelordet exit . Mer information finns i about_Language_Keywords.

  • När ett skript anropas direkt, till exempel ./Test.ps1, eller med anropsoperatorn (&) som & ./Test.ps1:

    Värdet $LASTEXITCODE för ändras inte om inte:

    • Skriptet anropar ett annat skript som använder nyckelordet exit
    • Skriptet anropar ett internt kommando
    • Skriptet använder nyckelordet exit
  • När ett skript anropas med powershell.exe filparametern $LASTEXITCODE anges till:

    • 1 om skriptet avslutades på grund av ett undantag
    • Värdet som anges av nyckelordet exit , om det används i skriptet
    • 0 om skriptet har slutförts
  • När ett skript anropas med powershell.exe hjälp av kommandoparametern $LASTEXITCODE anges till:

    • 1 om skriptet avslutades på grund av ett undantag eller om resultatet av det senaste kommandot är inställt $?$false
    • 0 om skriptet har slutförts och resultatet av det senaste kommandot har angetts $? till $true

Mer information om parametrarna Fil och kommando finns i about_PowerShell_exe.

$Matches

Variabeln $Matches fungerar med operatorerna -match och -notmatch . När du skickar skalär indata till operatorn -match eller -notmatch och antingen en identifierar en matchning returnerar de ett booleskt värde och fyller i den $Matches automatiska variabeln med en hashtabell med alla strängvärden som matchades. Hash-tabellen $Matches kan också fyllas med avbildningar när du använder reguljära uttryck med operatorn -match .

Mer information om operatorn finns i -match about_Comparison_Operators. Mer information om reguljära uttryck finns i about_Regular_Expressions.

Variabeln $Matches fungerar också i en switch -instruktion med parametern -Regex . Den är ifylld på samma sätt som operatorerna -match och -notmatch . Mer information om -instruktionen finns i switch about_Switch.

Kommentar

När $Matches fylls i i en session behåller den det matchade värdet tills det skrivs över av en annan matchning. Om -match används igen och ingen matchning hittas går det inte reset$Matches till $null. Det tidigare matchade värdet sparas tills $Matches en annan matchning hittas.

$MyInvocation

Innehåller information om current kommandot, till exempel namn, parametrar, parametervärden och information om hur kommandot startades, anropades eller anropades, till exempel namnet på skriptet som anropade current kommandot.

$MyInvocation fylls endast i för skript, funktions- och skriptblock. Du kan använda informationen i objektet System.Management.Automation.InvocationInfo som $MyInvocation returneras i skriptetcurrent, till exempel namnet på en funktion ($MyInvocation.MyCommand.Name) för att identifiera current kommandot. Detta är användbart för att hitta namnet på skriptet current .

Från och med PowerShell 3.0 MyInvocation har följande nya egenskaper.

  • PSScriptRoot – innehåller den fullständiga sökvägen till skriptet som anropade current kommandot. Värdet för den här egenskapen fylls bara i när anroparen är ett skript.
  • PSCommandPath – innehåller den fullständiga sökvägen och filnamnet för skriptet current som anropade kommandot. Värdet för den här egenskapen fylls bara i när anroparen är ett skript.

$PSScriptRoot Till skillnad från de automatiska variablerna och $PSCommandPath innehåller egenskaperna PSScriptRoot och PSCommandPath för den $MyInvocation automatiska variabeln information om anroparen eller anropar skriptet, inte skriptetcurrent.

$NestedPromptLevel

Innehåller current promptnivån. Värdet 0 anger den ursprungliga promptnivån. Värdet ökas när du anger en kapslad nivå och minskar när du avslutar den.

PowerShell visar till exempel en kapslad kommandotolk när du använder $Host.EnterNestedPrompt metoden. PowerShell visar också en kapslad kommandotolk när du når en brytpunkt i PowerShell-felsökningsprogrammet.

När du anger en kapslad fråga pausar current PowerShell kommandot, sparar körningskontexten och ökar värdet för variabeln $NestedPromptLevel . Om du vill skapa ytterligare kapslade kommandotolk (upp till 128 nivåer) eller återgå till den ursprungliga kommandotolken slutför du kommandot eller skriver exit.

Variabeln $NestedPromptLevel hjälper dig att spåra promptnivån. Du kan skapa en alternativ PowerShell-kommandotolk som innehåller det här värdet så att det alltid visas.

$null

$null är en automatisk variabel som innehåller ett null - eller tomt värde. Du kan använda den här variabeln för att representera ett frånvarande eller odefinierat värde i kommandon och skript.

PowerShell behandlar $null som ett objekt med ett värde eller en platshållare, så du kan använda $null för att representera ett tomt värde i en samling värden.

När det till exempel $null ingår i en samling räknas det som ett av objekten.

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

Om du dirigerar variabeln $null till cmdleten ForEach-Object genereras ett värde för $null, precis som för de andra objekten

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

Därför kan du inte använda $null för att ange något parametervärde. Ett parametervärde $null för åsidosätter standardparametervärdet.

Men eftersom PowerShell behandlar variabeln $null som platshållare kan du använda den i skript som följande, vilket inte skulle fungera om $null den ignorerades.

$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

Innehåller processidentifieraren (PID) för den process som är värd för current PowerShell-sessionen.

$PROFILE

Innehåller den fullständiga sökvägen för PowerShell-profilen current för användaren och current värdprogrammet. Du kan använda den här variabeln för att representera profilen i kommandon. Du kan till exempel använda den i ett kommando för att avgöra om en profil har skapats:

Test-Path $PROFILE

Du kan också använda den i ett kommando för att skapa en profil:

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

Du kan använda den i ett kommando för att öppna profilen i notepad.exe:

notepad.exe $PROFILE

$PSBoundParameters

Innehåller en ordlista över de parametrar som skickas till ett skript eller en funktion och deras current värden. Den här variabeln har endast ett värde i ett omfång där parametrar deklareras, till exempel ett skript eller en funktion. Du kan använda den för att visa eller ändra värdena för current parametrar eller för att skicka parametervärden till ett annat skript eller en annan funktion.

I det här exemplet skickar $PSBoundParameters funktionen Test2 funktionen till funktionen Test1. $PSBoundParameters Visas i formatet Nyckel och Värde.

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

Innehåller ett objekt som representerar cmdleten eller den avancerade funktion som körs.

Du kan använda egenskaperna och metoderna för objektet i din cmdlet eller funktionskod för att svara på användningsvillkoren. Egenskapen ParameterSetName innehåller till exempel namnet på parameteruppsättningen som används, och metoden ShouldProcess lägger till parametrarna WhatIf och Confirm till cmdleten dynamiskt.

Mer information om den $PSCmdlet automatiska variabeln finns i about_Functions_CmdletBindingAttribute och about_Functions_Advanced.

$PSCommandPath

Innehåller den fullständiga sökvägen och filnamnet för skriptet som körs. Den här variabeln är giltig i alla skript.

$PSCulture

Innehåller namnet på den kultur som för närvarande används i operativsystemet. Kulturen bestämmer visningsformatet för objekt som tal, valuta och datum och lagras i ett System.Globalization.CultureInfo-objekt . Använd Get-Culture för att visa datorns kultur. $PSCulture innehåller värdet för egenskapen Name .

$PSDebugContext

Under felsökningen innehåller den här variabeln information om felsökningsmiljön. Annars innehåller den ett null-värde . Därför kan du använda den för att avgöra om felsökaren har kontroll. När det är ifyllt innehåller det ett PsDebugContext-objekt som har egenskaper för Brytpunkter och InvocationInfo . Egenskapen InvocationInfo har flera användbara egenskaper, inklusive egenskapen Plats . Egenskapen Plats anger sökvägen till skriptet som debuggas.

$PSEdition

Innehåller samma värde i $PSVersionTable.PSEdition. Den här variabeln är tillgänglig för användning i modulmanifestfiler, medan $PSVersionTable den inte är det.

$PSHOME

Innehåller den fullständiga sökvägen till installationskatalogen för PowerShell, vanligtvis $env:windir\System32\PowerShell\v1.0 i Windows-system. Du kan använda den här variabeln i sökvägarna för PowerShell-filer. Följande kommando söker till exempel i de konceptuella hjälpavsnitten efter ordet Hjälp:

Select-String -Pattern Help -Path $PSHOME\en-US\*.txt

$PSItem

Samma som $_. Innehåller objektet current i pipelineobjektet. Du kan använda den här variabeln i kommandon som utför en åtgärd på varje objekt i en pipeline.

Mer information finns i about_PSItem.

$PSScriptRoot

Innehåller den fullständiga sökvägen till det körande skriptets överordnade katalog.

I PowerShell 2.0 är den här variabeln endast giltig i skriptmoduler (.psm1). Från och med PowerShell 3.0 är det giltigt i alla skript.

$PSSenderInfo

Innehåller information om användaren som startade PSSession, inklusive användaridentiteten och tidszonen för den ursprungliga datorn. Den här variabeln är endast tillgänglig i PSSessions.

Variabeln $PSSenderInfo innehåller en användarkonfigurerbar egenskap, ApplicationArguments, som som standard endast $PSVersionTable innehåller från den ursprungliga sessionen. Om du vill lägga till data i egenskapen ApplicationArguments använder du parametern ApplicationArguments för cmdleten New-PSSessionOption .

$PSUICulture

Innehåller namnet på användargränssnittskulturen (UI) som har konfigurerats i operativsystemet. Användargränssnittskulturen avgör vilka textsträngar som används för användargränssnittselement, till exempel menyer och meddelanden. Det här är värdet för System.Globalization.CultureInfo.CurrentUICulture.Name-egenskapen i systemet. Använd cmdleten Get-UICulture för att hämta system.Globalization.CultureInfo-objektet för systemet.

$PSVersionTable

Innehåller en skrivskyddad hash-tabell som visar information om den version av PowerShell som körs i current sessionen. Tabellen innehåller följande objekt:

  • BuildVersion – versionsnumret för current versionen
  • CLRVersion – versionen av CLR (Common Language Runtime)
  • PSCompatibleVersions – Versioner av PowerShell som är kompatibla med current versionen
  • PSEdition – Den här egenskapen har värdet "Desktop", för Windows Server- och Windows-klientversioner. Den här egenskapen har värdet "Core" för PowerShell som körs under Nano Server eller Windows IoT.
  • PSRemotingProtocolVersion – versionen av PowerShell-protokollet för fjärrhantering.
  • PSVersion – PowerShell-versionsnumret
  • SerializationVersion – versionen av serialiseringsmetoden
  • WSManStackVersion – versionsnumret för WS-Management-stacken

$PWD

Innehåller ett sökvägsobjekt som representerar den fullständiga sökvägen till current katalogplatsen för current PowerShell-runspace.

Kommentar

PowerShell stöder flera runspaces per process. Varje runspace har en egen current katalog. Det här är inte samma som katalogen för current processen: [System.Environment]::CurrentDirectory.

$Sender

Innehåller objektet som genererade den här händelsen. Den här variabeln fylls endast i i åtgärdsblocket för ett händelseregistreringskommando. Värdet för den här variabeln finns också i egenskapen Sender för objektet PSEventArgs som Get-Event returneras.

$ShellId

Innehåller gränssnittets current identifierare.

$StackTrace

Innehåller en stackspårning för det senaste felet.

$switch

Innehåller uppräknaren, inte de resulterande värdena för en Switch -instruktion. Variabeln finns bara när -instruktionen Switch körs. Den $switch tas bort när -instruktionen slutför körningenswitch. Mer information finns i about_Switch.

Uppräknare innehåller egenskaper och metoder som du kan använda för att hämta loopvärden och ändra loop-iterationen current . Mer information finns i Använda uppräknare.

$this

Variabeln $this används i skriptblock som utökar klasser för att referera till själva klassens instans.

Med ETS (Extensible Type System) i PowerShell kan du lägga till egenskaper i klasser med hjälp av skriptblock. I ett skriptblock som definierar en skriptegenskap eller skriptmetod refererar variabeln $this till en instans av objektet i klassen som utökas. PowerShell använder till exempel ETS för att lägga till egenskapen BaseName i klassen 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};}

Mer information finns i about_Types.ps1xml.

I en PowerShell-klass refererar variabeln $this till själva instansobjektet för klassen, vilket ger åtkomst till egenskaper och metoder som definierats i klassen. Mer information finns i about_Classes.

Variabeln $this används också av .NET-händelseklasser som tar skriptblock som ombud för händelsehanteraren. I det här scenariot $this representerar objektet som kommer från händelsen, som kallas händelsesändare.

$true

Innehåller Sant. Du kan använda den här variabeln för att representera Sant i kommandon och skript.

Använda uppräknare

Variablerna $input, $foreachoch $switch är alla uppräknare som används för att iterera genom de värden som bearbetas av deras innehållande kodblock.

En uppräkning innehåller egenskaper och metoder som du kan använda för att avancera eller reset iteration eller hämta iterationsvärden. Direktmanipulering av uppräknare anses inte vara bästa praxis.

MoveNext

Metoden MoveNext flyttar uppräknaren till nästa element i samlingen. MoveNext returnerar True om uppräknaren har avancerats, False om uppräknaren har passerat slutet av samlingen.

Kommentar

Det booleska värdet som returneras av MoveNext skickas till utdataströmmen. Du kan ignorera utdata genom att skriva till [void] eller skicka dem till Out-Null.

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

Reset

Metoden Reset anger uppräknaren till sin ursprungliga position, vilket är före det första elementet i samlingen.

Current

Egenskapen Current hämtar elementet i samlingen, eller pipelinen, på current positionen för uppräknaren.

Egenskapen Current fortsätter att returnera samma egenskap tills MoveNext anropas.

Exempel

Exempel 1: Använda variabeln $input

I följande exempel rensar åtkomst till variabeln $input variabeln till nästa gång processblocket körs. Med hjälp av Reset metoden återställs variabeln $input till current pipelinevärdet.

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

Processblocket avancerar automatiskt variabeln $input även om du inte har åtkomst till den.

$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

Exempel 2: Använda $input utanför processblocket

Utanför processblocket representerar variabeln $input alla värden som skickas till funktionen.

  • När du kommer åt variabeln $input rensas alla värden.
  • Metoden Reset återställer hela samlingen.
  • Egenskapen Current fylls aldrig i.
  • Metoden MoveNext returnerar false eftersom samlingen inte kan avanceras.
    • Om du anropar MoveNext rensas variabeln $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:

Exempel 3: Använda $input.Current egenskap

Med egenskapen Current current kan pipelinevärdet nås flera gånger utan att metoden används Reset . Processblocket anropar inte metoden MoveNext automatiskt.

Egenskapen Current fylls aldrig i om du inte uttryckligen anropar MoveNext. Egenskapen Current kan nås flera gånger i processblocket utan att rensa dess värde.

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

Exempel 4: Använda variabeln $foreach

Till skillnad från variabeln $input representerar variabeln $foreach alltid alla objekt i samlingen när den används direkt. Current Använd egenskapen för att komma åt samlingselementet current och Reset metoderna och MoveNext för att ändra dess värde.

Kommentar

Varje iteration av loopen foreach anropar automatiskt metoden MoveNext .

Följande loop körs bara två gånger. I den andra iterationen flyttas samlingen till det tredje elementet innan iterationen är klar. Efter den andra iterationen finns det nu inga fler värden att iterera och loopen avslutas.

Egenskapen MoveNext påverkar inte den variabel som valts för att iterera genom samlingen ($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

Med hjälp av Reset metoden återställs elementet current i samlingen. I följande exempel loopas de två första elementen Reset två gånger eftersom metoden anropas. Efter de två första looparna misslyckas -instruktionen if och loopen itererar genom alla tre elementen normalt.

Viktigt!

Detta kan resultera i en oändlig loop.

$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

Exempel 5: Använda variabeln $switch

Variabeln $switch har exakt samma regler som variabeln $foreach . I följande exempel visas alla uppräkningsbegrepp.

Kommentar

Observera hur det NotEvaluated-fallet aldrig körs, även om det inte finns någon break instruktion efter metoden 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

Se även