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:
- $$
- $?
- $^
- $_
- $args
- $ConsoleFileName
- $Error
- $Event
- $EventArgs
- $EventSubscriber
- $ExecutionContext
- $false
- $foreach
- $HOME
- $Host
- $input
- $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
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
,process
ellerend
-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ådeprocess
blocket ochend
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 nyckelordetexit
. 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
- Skriptet anropar ett annat skript som använder nyckelordet
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$?
på$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
, $foreach
och $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.
Inom loopar bryts nyckelorden för flödeskontroll och fortsätter bör föredras.
I funktioner som accepterar pipelineindata är det bästa praxis att använda parametrar med attributen ValueFromPipeline eller ValueFromPipelineByPropertyName .
Mer information finns i about_Functions_Advanced_Parameters.
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
.
- Om du anropar MoveNext rensas variabeln
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