about_Automatic_Variables
Popisuje proměnné, které ukládají informace o stavu pro powershell a vytvářejí a udržují.
Koncepčně se většina těchto proměnných považuje za jen pro čtení. I když mohou být zapsány do, pro zpětnou kompatibilitu by neměly být zapsány do.
Tady je seznam automatických proměnných v PowerShellu:
$$
$?
$^
$_
$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
Obsahuje poslední token na posledním řádku přijatém relací.
Obsahuje stav spuštění posledního příkazu.
Obsahuje hodnotu True, pokud byl poslední příkaz úspěšný a nepravda, pokud selhal. Výsledkem parsování chyb není provádění, takže nemají vliv na hodnotu $?
.
Pro rutiny a pokročilé funkce, které se spouští v několika fázích v kanálu, například v obou process
a blocích, volání end
nebo this.WriteError()
v libovolném bodě se nastaví $PSCmdlet.WriteError()
na $?
.
Rutina Write-Error
se vždy nastaví $?
na False hned po jeho spuštění, ale pro funkci, která ji volá, nenastaví $?
hodnotu 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
Pro druhý účel $PSCmdlet.WriteError()
je vhodné místo toho použít.
U nativních příkazů (spustitelných souborů) $?
je nastavena hodnota True, pokud $LASTEXITCODE
je hodnota 0, a pokud je jakákoli jiná hodnota nastavená na Hodnotu False$LASTEXITCODE
.
Poznámka
Až do PowerShellu 7 zabalení příkazu do závorek (...)
, podvýraz syntaxe $(...)
, nebo maticový výraz @(...)
vždy resetoval $?
na True. Například (Write-Error)
se zobrazí $?
jako Pravda. Toto chování se změnilo v PowerShellu 7, aby $?
vždy odráželo skutečný úspěch posledního příkazu spuštěného v těchto výrazech.
Obsahuje první token na posledním řádku přijatém relací.
Stejné jako $PSItem
. Obsahuje aktuální objekt v objektu kanálu. Tuto proměnnou můžete použít v příkazech, které provádějí akci u každého objektu v kanálu.
Další informace najdete v tématu about_PSItem.
Obsahuje pole hodnot pro nedelarované parametry, které jsou předány funkci, skriptu nebo bloku skriptu. Při vytváření funkce můžete deklarovat parametry pomocí klíčového param
slova nebo přidáním čárkami odděleného seznamu parametrů v závorkách za názvem funkce.
V akci $args
události obsahuje proměnná objekty, které představují argumenty události zpracovávané události. Tato proměnná se naplní pouze v Action
rámci bloku příkazu pro registraci události. Hodnotu této proměnné lze také najít ve SourceArgs vlastnost objektu PSEventArgs , který Get-Event
vrací.
Obsahuje cestu k souboru konzoly (.psc1
), který byl naposledy použit v relaci. Tato proměnná se vyplní při spuštění PowerShellu pomocí parametru PSConsoleFile nebo při exportu Export-Console
názvů modulů snap-in do souboru konzoly pomocí rutiny.
Když použijete rutinu Export-Console
bez parametrů, automaticky aktualizuje soubor konzoly, který byl naposledy použit v relaci. Tuto automatickou proměnnou můžete použít k určení souboru, který se má aktualizovat.
Obsahuje seznam názvů povolených experimentálních funkcí.
Obsahuje pole chybových objektů, které představují nejnovější chyby. Poslední chyba je první objekt chyby v poli $Error[0]
.
Pokud chcete zabránit přidání chyby do $Error
pole, použijte společný parametr ErrorAction s hodnotou Ignore. Další informace najdete v tématu about_CommonParameters.
PSEventArgs Obsahuje objekt, který představuje událost, která se zpracovává. Tato proměnná se naplní pouze v Action
rámci bloku příkazu pro registraci události, například Register-ObjectEvent
. Hodnota této proměnné je stejný objekt, který rutina Get-Event
vrací. Vlastnosti proměnné, například Event
, můžete použít $Event.TimeGenerated
v Action
bloku skriptu.
Obsahuje objekt, který představuje první argument události, který je odvozen z EventArgs události, která se zpracovává. Tato proměnná se naplní pouze v Action
rámci bloku příkazu pro registraci události. Hodnotu této proměnné lze také najít ve SourceEventArgs vlastnost objektu PSEventArgs , který Get-Event
vrací.
PSEventSubscriber Obsahuje objekt, který představuje odběratel události zpracovávané události. Tato proměnná se naplní pouze v Action
rámci bloku příkazu pro registraci události. Hodnota této proměnné je stejný objekt, který rutina Get-EventSubscriber
vrací.
Obsahuje EngineIntrinsics objekt, který představuje kontext spuštění hostitele PowerShellu. Tuto proměnnou můžete použít k vyhledání objektů spuštění, které jsou k dispozici pro rutiny.
Obsahuje hodnotu False. Tuto proměnnou můžete použít k reprezentaci False v příkazech a skriptech namísto použití řetězce "false"
. Řetězec lze interpretovat jako True , pokud je převeden na neprázdný řetězec nebo na nenulové celé číslo.
Obsahuje enumerátor (nikoli výsledné hodnoty) smyčky ForEach . Proměnná existuje pouze v době, kdy $ForEach
je smyčka spuštěná. Po ForEach
dokončení smyčky se odstraní.
Enumerátory obsahují vlastnosti a metody, které můžete použít k načtení hodnot smyčky a změně aktuální iterace smyčky. Další informace naleznete v tématu Použití enumerátorů.
Obsahuje úplnou cestu domovského adresáře uživatele. Ve Windows tato proměnná používá hodnotu "$env:USERPROFILE"
proměnné prostředí Windows, obvykle C:\Users\<UserName>
. V systému Unix tato proměnná používá hodnotu HOME
proměnné prostředí.
Důležité
Systém Windows může přesměrovat umístění profilu uživatele. To znamená, že $HOME
nemusí mít stejnou hodnotu jako "$env:HOMEDRIVE$env:HOMEPATH"
.
Obsahuje objekt, který představuje aktuální hostitelskou aplikaci pro PowerShell.
Tuto proměnnou můžete použít k reprezentaci aktuálního hostitele v příkazech nebo k zobrazení nebo změně vlastností hostitele, například $Host.version
nebo $Host.CurrentCulture
nebo $Host.UI.RawUI.BackGroundColor = "Red"
.
Poznámka
Nastavení barev byla $Host.PrivateData
nahrazena proměnnou $PSStyle
předvoleb. Další informace najdete v tématu about_ANSI_Terminals.
Obsahuje enumerátor, který vyčísluje všechny vstupy předané funkci.
Proměnná $input
je k dispozici pouze pro funkce, bloky skriptů (které jsou nepojmenované funkce) a soubory skriptů (které jsou uložené bloky skriptu).
Ve funkci bez
begin
,process
neboend
bloku$input
, proměnná vyčíslí kolekci všech vstupů do funkce.begin
V bloku$input
proměnná neobsahuje žádná data.V bloku
process
obsahuje proměnná$input
aktuální objekt v kanálu.end
V bloku$input
proměnná vyčíslí kolekci všech vstupů funkce.Poznámka
Proměnnou
$input
uvnitřprocess
bloku iend
bloku nemůžete použít ve stejné funkci nebo bloku skriptu.
Vzhledem k tomu $input
, že je enumerátor, přístup k některé z jeho vlastností $input
již není k dispozici. Vlastnosti můžete znovu $input
použít $input
v jiné proměnné.
Enumerátory obsahují vlastnosti a metody, které můžete použít k načtení hodnot smyčky a změně aktuální iterace smyčky. Další informace naleznete v tématu Použití enumerátorů.
Proměnná $input
je také k dispozici pro příkaz určený parametrem -Command
při vyvolání z příkazového pwsh
řádku. Následující příklad se spustí z příkazového prostředí Windows.
echo Hello | pwsh -Command """$input World!"""
Obsahuje $true
, pokud je aktuální relace spuštěná v prostředí .NET Core Runtime (CoreCLR). Jinak obsahuje $false
.
Obsahuje $true
, pokud je aktuální relace spuštěná v operačním systému Linux.
Jinak obsahuje $false
.
Obsahuje $true
, pokud je aktuální relace spuštěná v operačním systému macOS.
Jinak obsahuje $false
.
Obsahuje $true
, pokud je aktuální relace spuštěná v operačním systému Windows. Jinak obsahuje $false
.
Obsahuje ukončovací kód posledního nativního programu nebo skriptu PowerShellu, který se spustil.
U skriptů PowerShellu $LASTEXITCODE
závisí hodnota na tom, jak byl skript volána, a na tom, jestli exit
se použilo klíčové slovo:
Pokud skript používá
exit
klíčové slovo:$LASTEXITCODE
je nastavena na hodnotu určenou klíčovým slovemexit
. Další informace najdete v tématu about_Language_Keywords.Pokud je skript volána přímo, například , nebo
./Test.ps1
pomocí operátoru volání (&
) jako& ./Test.ps1
:Hodnota
$LASTEXITCODE
není změněna, pokud:- Skript volá jiný skript, který používá
exit
klíčové slovo. - Skript volá nativní příkaz.
- Skript používá
exit
klíčové slovo.
- Skript volá jiný skript, který používá
Při zavolání skriptu pomocí
pwsh
parametru je nastavena na:-
1
pokud se skript ukončil kvůli výjimce - Hodnota zadaná klíčovým slovem
exit
, pokud se používá ve skriptu -
0
pokud se skript úspěšně dokončil
-
Při zavolání skriptu pomocí
pwsh
parametru je nastaveno na:-
1
pokud se skript ukončil z důvodu výjimky nebo pokud je výsledek posledního příkazu nastavený$?
na$false
-
0
pokud se skript úspěšně dokončil a výsledek poslední sady příkazů nastaven$?
na$true
-
Další informace o parametrech File a Command najdete v tématu about_Pwsh.
Proměnná $Matches
pracuje s operátory a -match
operátory-notmatch
. Když odešlete skalární vstup operátoru -match
nebo -notmatch
operátoru a buď jeden zjistí shodu, vrátí logickou hodnotu a naplní $Matches
automatickou proměnnou tabulkou hash všech hodnot řetězce, které byly spárovány. Do $Matches
tabulky hash je také možné zachytávat zachytávání při použití regulárních výrazů s operátorem -match
.
Další informace o operátoru -match
najdete v tématu about_Comparison_Operators. Další informace o regulárních výrazech najdete v tématu about_Regular_Expressions.
Proměnná $Matches
funguje také v switch
příkazu s parametrem -Regex
. Naplní se stejným způsobem jako operátory a -match
operátory-notmatch
. Další informace o switch
příkazu najdete v tématu about_Switch.
Poznámka
Když $Matches
je v relaci naplněna, zachová se odpovídající hodnota, dokud ji nepřepíše jiná shoda. Pokud se -match
znovu použije a nenajde se žádná shoda, neobnoví se $Matches
na $null
. Dříve spárovaná hodnota se uchovává, $Matches
dokud se nenajde jiná shoda.
Obsahuje informace o aktuálním příkazu, například název, parametry, hodnoty parametrů a informace o tom, jak byl příkaz spuštěn, volán nebo vyvolán, například název skriptu, který volal aktuální příkaz.
$MyInvocation
je naplněn pouze pro skripty, funkce a bloky skriptů. K identifikaci aktuálního příkazu můžete použít informace v System.Management.Automation.InvocationInfo objektu, který $MyInvocation
vrací v aktuálním skriptu, například název funkce ($MyInvocation.MyCommand.Name
).
To je užitečné pro vyhledání názvu aktuálního skriptu.
Počínaje PowerShellem 3.0 MyInvocation
má následující nové vlastnosti.
- PSScriptRoot – obsahuje úplnou cestu ke skriptu, který vyvolal aktuální příkaz. Hodnota této vlastnosti je naplněna pouze v případě, že volající je skript.
- PSCommandPath – obsahuje úplnou cestu a název souboru skriptu, který vyvolal aktuální příkaz. Hodnota této vlastnosti je naplněna pouze v případě, že volající je skript.
Na rozdíl od $PSScriptRoot
a $PSCommandPath
automatických proměnných PSScriptRoot a PSCommandPath vlastnosti $MyInvocation
automatické proměnné obsahují informace o volajícím nebo volajícím skriptu, nikoli o aktuálním skriptu.
Obsahuje aktuální úroveň výzvy. Hodnota 0 označuje původní úroveň výzvy. Hodnota se zvýší, když zadáte vnořenou úroveň a po ukončení se sníží.
PowerShell například při použití $Host.EnterNestedPrompt
metody zobrazí vnořený příkazový řádek. PowerShell také při dosažení zarážky v ladicím programu PowerShellu zobrazí vnořený příkazový řádek.
Když zadáte vnořenou výzvu, PowerShell pozastaví aktuální příkaz, uloží kontext spuštění a zvýší hodnotu proměnné $NestedPromptLevel
. Pokud chcete vytvořit další vnořené příkazové řádky (až 128 úrovní) nebo se vrátit do původního příkazového řádku, dokončete příkaz nebo zadejte exit
.
Proměnná $NestedPromptLevel
vám pomůže sledovat úroveň výzvy. Můžete vytvořit alternativní příkazový řádek PowerShellu, který tuto hodnotu obsahuje, aby byla vždy viditelná.
$null
je automatická proměnná, která obsahuje hodnotu null nebo prázdnou hodnotu. Tuto proměnnou můžete použít k reprezentaci chybějící nebo nedefinované hodnoty v příkazech a skriptech.
PowerShell pracuje $null
jako s objektem s hodnotou nebo zástupným symbolem, takže můžete použít $null
k reprezentaci prázdné hodnoty v kolekci hodnot.
Pokud je například $null
součástí kolekce, počítá se jako jeden z objektů.
$a = "one", $null, "three"
$a.Count
3
Pokud proměnnou $null
předáte do ForEach-Object
rutiny, vygeneruje hodnotu stejně $null
jako pro ostatní objekty.
"one", $null, "three" | ForEach-Object {"Hello " + $_}
Hello one
Hello
Hello three
V důsledku toho nemůžete použít $null
žádnou hodnotu parametru. Hodnota parametru $null
přepíše výchozí hodnotu parametru.
Vzhledem k tomu, že PowerShell považuje $null
proměnnou za zástupný symbol, můžete ji použít ve skriptech jako v následujícím příkladu, což by nefungovalo, kdyby $null
bylo ignorováno.
$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
Obsahuje identifikátor procesu (PID) procesu, který je hostitelem aktuální relace PowerShellu.
Obsahuje úplnou cestu k profilu PowerShellu pro aktuálního uživatele a aktuální hostitelskou aplikaci. Tuto proměnnou můžete použít k reprezentaci profilu v příkazech. Můžete ho například použít v příkazu k určení, jestli byl profil vytvořen:
Test-Path $PROFILE
Nebo ho můžete použít v příkazu k vytvoření profilu:
New-Item -ItemType file -Path $PROFILE -Force
Profil můžete otevřít v notepad.exe pomocí příkazu:
notepad.exe $PROFILE
Obsahuje slovník parametrů, které jsou předány skriptu nebo funkci a jejich aktuální hodnoty. Tato proměnná má hodnotu pouze v oboru, kde jsou deklarovány parametry, jako je skript nebo funkce. Můžete ho použít k zobrazení nebo změně aktuálních hodnot parametrů nebo předání hodnot parametrů jinému skriptu nebo funkci.
V tomto příkladu funkce Test2 předá $PSBoundParameters
funkci Test1 funkci. Zobrazí se $PSBoundParameters
ve formátu klíč a hodnota.
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
Obsahuje objekt, který představuje rutinu nebo pokročilou funkci, která se spouští.
Pomocí vlastností a metod objektu v kódu rutiny nebo funkce můžete reagovat na podmínky použití. Například ParameterSetName vlastnost obsahuje název sady parametrů, která se používá, a Metoda ShouldProcess přidá WhatIf a Confirm parametry do rutiny dynamicky.
Další informace o $PSCmdlet
automatické proměnné najdete v tématu about_Functions_CmdletBindingAttribute a about_Functions_Advanced.
Obsahuje úplnou cestu a název souboru skriptu, který se spouští. Tato proměnná je platná ve všech skriptech.
Počínaje PowerShellem 7 $PSCulture
odráží kulturu aktuálního prostoru pro spuštění (relace) PowerShell. Pokud se jazyková verze změní v prostředí Runspace PowerShellu, $PSCulture
aktualizuje se hodnota pro tento runspace.
Jazyková verze určuje formát zobrazení položek, jako jsou čísla, měna a kalendářní data, a je uložen v objektu System.Globalization.CultureInfo . Slouží Get-Culture
k zobrazení jazykové verze počítače.
$PSCulture
obsahuje hodnotu vlastnosti Name.
Při ladění tato proměnná obsahuje informace o prostředí ladění. V opačném případě obsahuje hodnotu null . V důsledku toho ho můžete použít k určení, jestli má ladicí program kontrolu. Při naplnění obsahuje PsDebugContext objekt, který má Breakpoints a InvocationInfo vlastnosti. Vlastnost InvocationInfo má několik užitečných vlastností, včetně location vlastnost. Vlastnost Location označuje cestu ke skriptu, který je laděný.
Obsahuje stejnou hodnotu v $PSVersionTable.PSEdition
. Tato proměnná je k dispozici pro použití v souborech manifestu modulu, zatímco $PSVersionTable
ne.
Obsahuje úplnou cestu instalačního adresáře pro PowerShell, obvykle C:\Program Files\PowerShell\7
v systémech Windows. Tuto proměnnou můžete použít v cestách k souborům PowerShellu. Například následující příkaz vyhledá koncepční témata nápovědy pro slovo Nápověda:
Select-String -Pattern Help -Path $PSHOME\en-US\*.txt
Stejné jako $_
. Obsahuje aktuální objekt v objektu kanálu. Tuto proměnnou můžete použít v příkazech, které provádějí akci u každého objektu v kanálu.
Další informace najdete v tématu about_PSItem.
Obsahuje úplnou cestu nadřazeného adresáře spuštěného skriptu.
V PowerShellu 2.0 je tato proměnná platná pouze v modulech skriptu (.psm1
).
Počínaje PowerShellem 3.0 je platný ve všech skriptech.
Obsahuje informace o uživateli, který spustil psSession, včetně identity uživatele a časového pásma původního počítače. Tato proměnná je k dispozici pouze v konfiguracích PSSession.
Proměnná $PSSenderInfo
obsahuje uživatelsky konfigurovatelnou vlastnost ApplicationArguments, která ve výchozím nastavení obsahuje pouze $PSVersionTable
z původní relace. Pokud chcete přidat data do vlastnosti ApplicationArguments , použijte parametr ApplicationArguments rutiny New-PSSessionOption
.
Obsahuje název jazykové verze uživatelského rozhraní (UI), která je nakonfigurovaná v operačním systému. Jazyková verze uživatelského rozhraní určuje, které textové řetězce se používají pro prvky uživatelského rozhraní, jako jsou nabídky a zprávy. Toto je hodnota vlastnosti System.Globalization.CultureInfo.CurrentUICulture.Name systému. K získání objektu System.Globalization.CultureInfo pro systém použijte rutinu Get-UICulture
.
Obsahuje tabulku hash jen pro čtení, která zobrazuje podrobnosti o verzi PowerShellu spuštěné v aktuální relaci. Tabulka obsahuje následující položky:
- PSVersion – číslo verze PowerShellu
-
PSEdition Tato vlastnost má hodnotu Desktop pro PowerShell 4 a níže a také PowerShell 5.1 v plnohodnotných edicích Windows. Tato vlastnost má hodnotu
Core
pro PowerShell 6 a vyšší a také Windows PowerShell 5.1 v edicích s omezenými nároky, jako je Windows Nano Server nebo Windows IoT. - GitCommitId – ID potvrzení zdrojových souborů v GitHubu
- Operační systém – popis operačního systému, na kterém běží PowerShell.
-
Platforma – platforma , na které běží operační systém. Hodnota v systémech Linux a macOS je Unix. Viz
$IsMacOs
a$IsLinux
. - PSCompatibleVersions – verze PowerShellu, které jsou kompatibilní s aktuální verzí
- PSRemotingProtocolVersion – verze protokolu vzdálené správy PowerShellu.
- SerializationVersion – verze metody serializace
- WSManStackVersion – číslo verze zásobníku WS-Management
Obsahuje objekt cesty, který představuje úplnou cestu k aktuálnímu umístění adresáře pro aktuální prostředí PowerShell runspace.
Poznámka
PowerShell podporuje více prostředí runspace na proces. Každý runspace má svůj vlastní aktuální adresář. To není stejné jako aktuální adresář procesu: [System.Environment]::CurrentDirectory
.
Obsahuje objekt, který vygeneroval tuto událost. Tato proměnná se naplní pouze v rámci bloku akce příkazu registrace události. Hodnotu této proměnné lze nalézt také ve vlastnosti Sender objektu PSEventArgs , který Get-Event
vrací.
Obsahuje identifikátor aktuálního shellu.
Obsahuje trasování zásobníku pro nejnovější chybu.
Obsahuje enumerátor, nikoli výsledné hodnoty Switch
příkazu.
$switch
Proměnná existuje pouze v době, kdy Switch
je příkaz spuštěný. Když příkaz dokončí provádění, odstraní switch
se. Další informace najdete v tématu about_Switch.
Enumerátory obsahují vlastnosti a metody, které můžete použít k načtení hodnot smyčky a změně aktuální iterace smyčky. Další informace naleznete v tématu Použití enumerátorů.
Proměnná $this
se používá v blocích skriptu, které rozšiřují třídy tak, aby odkazovala na instanci samotné třídy.
Systém ETS (Extensible Type System) PowerShellu umožňuje přidávat vlastnosti do tříd pomocí bloků skriptů. V bloku skriptu, který definuje vlastnost skriptu nebo metodu skriptu, $this
proměnná odkazuje na instanci objektu třídy, která se rozšiřuje. PowerShell například používá ETS k přidání BaseName vlastnost FileInfo třídy.
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};}
Další informace najdete v tématu about_Types.ps1xml.
Ve třídě PowerShellu $this
proměnná odkazuje na objekt instance samotné třídy, což umožňuje přístup k vlastnostem a metodám definovaným ve třídě. Další informace najdete v tématu about_Classes.
Proměnnou $this
také používají třídy událostí .NET, které přebírají bloky skriptu jako delegáty pro obslužnou rutinu události. V tomto scénáři představuje objekt pocházející $this
z události, který se označuje jako odesílatel události.
Obsahuje hodnotu True. Tuto proměnnou můžete použít k reprezentaci true v příkazech a skriptech.
Proměnné $input
a , $foreach
$switch
jsou všechny enumerátory používané k iteraci hodnot zpracovaných jejich obsahujícím blok kódu.
Enumerátor obsahuje vlastnosti a metody, které můžete použít k postupu nebo resetování iterace nebo načtení hodnot iterace. Přímá manipulace s enumerátory se nepovažuje za osvědčený postup.
Ve smyčce by se měla upřednostňovat přerušení klíčových slov řízení toku a pokračování.
V rámci funkcí, které přijímají vstup kanálu, je osvědčeným postupem použít parametry s atributy ValueFromPipeline nebo ValueFromPipelineByPropertyName .
Další informace najdete v tématu about_Functions_Advanced_Parameters.
Metoda MoveNext přejde enumerátor na další prvek kolekce.
MoveNext vrátí True
, pokud byl enumerátor úspěšně rozšířen, False
pokud enumerátor předal konec kolekce.
Poznámka
Logická hodnota vrácená MoveNext je odeslána do výstupního datového proudu.
Výstup můžete potlačit tak, že ho [void]
zadáte do vysílání nebo ho přepnete na hodnotu Out-Null.
$input.MoveNext() | Out-Null
[void]$input.MoveNext()
Metoda Reset nastaví enumerátor na počáteční pozici, která je před prvním prvkem v kolekci.
Vlastnost Current získá prvek v kolekci nebo kanálu na aktuální pozici enumerátoru.
Tato Current vlastnost bude nadále vracet stejnou vlastnost, dokud MoveNext není volána.
V následujícím příkladu $input
přístup k proměnné vymaže proměnnou, dokud se příště nespustí blok procesu. Pomocí metody Reset se proměnná $input
resetuje na aktuální hodnotu v aktuálním řetězci operací.
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
Blok procesu automaticky posune $input
proměnnou, i když k ní nemáte přístup.
$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
Mimo blok $input
procesu představuje proměnná všechny hodnoty předané do funkce.
-
$input
Přístup k proměnné vymaže všechny hodnoty. - Metoda Reset resetuje celou kolekci.
- Vlastnost Current se nikdy nenaplní.
- Metoda MoveNext vrátí hodnotu false, protože kolekci nelze upřesnit.
- Volání MoveNext vymaže proměnnou
$input
.
- Volání MoveNext vymaže proměnnou
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:
Pomocí vlastnosti Current lze k aktuální hodnotě kanálu přistupovat vícekrát bez použití metody Reset. Blok procesu automaticky nevolá metodu MoveNext .
Vlastnost Current se nikdy nenaplní, pokud explicitně nezavoláte MoveNext. K Current vlastnosti lze přistupovat vícekrát uvnitř bloku procesu bez vymazání jeho hodnoty.
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
$input
Na rozdíl od proměnné tato proměnná $foreach
vždy představuje všechny položky v kolekci při přímém přístupu. Pomocí Current vlastnost pro přístup k aktuálnímu prvku kolekce a Reset a MoveNext metody změnit jeho hodnotu.
Poznámka
Každá iterace smyčky foreach
automaticky volá Metodu MoveNext .
Následující smyčka se spustí pouze dvakrát. V druhé iteraci se kolekce před dokončením iterace přesune do třetího prvku. Po druhé iteraci teď nejsou k dispozici žádné další hodnoty pro iteraci a smyčka se ukončí.
MoveNext vlastnost nemá vliv na proměnnou zvolenou pro iteraci kolekcí ($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
Pomocí metody Reset resetuje aktuální prvek v kolekci. Následující příklad prochází první dva prvky dvakrát , protože Reset metoda je volána. Po prvních dvou smyčce if
příkaz selže a smyčka iteruje všechny tři prvky normálně.
Důležité
To může vést k nekonečné smyčce.
$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
Proměnná $switch
má stejná pravidla jako proměnná $foreach
. Následující příklad ukazuje všechny koncepty enumerátoru.
Poznámka
Všimněte si, jak NotEvaluated case není nikdy proveden, i když neexistuje žádný break
příkaz za MoveNext metoda.
$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
Zpětná vazba k produktu PowerShell
PowerShell je open source projekt. Vyberte odkaz pro poskytnutí zpětné vazby: