Sdílet prostřednictvím


about_Automatic_Variables

Krátký popis

Popisuje proměnné, které ukládají informace o stavu a které vytváří a udržuje PowerShell.

Dlouhý popis

Koncepčně se většina těchto proměnných považuje za jen pro čtení. I když mohou být zapisovat do, z důvodu zpětné kompatibility by neměly být zapsány.

Tady je seznam automatických proměnných v PowerShellu:

$$

Obsahuje poslední token na posledním řádku přijatém relací.

$?

Obsahuje stav spuštění posledního příkazu. Obsahuje True, pokud byl poslední příkaz úspěšný a false, pokud selhal. Chyby analýzy se neprovedou, takže neovlivňují hodnotu $?.

Pro rutiny a pokročilé funkce, které se spouští v několika fázích kanálu, například v process i end blocích, volání this.WriteError() nebo $PSCmdlet.WriteError() v libovolném okamžiku nastaví $? na false, stejně jako this.ThrowTerminatingError() a $PSCmdlet.ThrowTerminatingError().

Cmdlet Write-Error vždy nastaví $? na false ihned po jeho spuštění, ale nenastaví $? na false pro funkci, která ho volá:

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

Místo toho by pro tento účel měla být použita $PSCmdlet.WriteError().

U nativních příkazů (spustitelných souborů) je $? nastavena na True, když je $LASTEXITCODE 0, a na False, když je $LASTEXITCODE jakákoli jiná hodnota.

Poznámka

Do PowerShell verze 7 zabalování příkazu do závorek (...), podvýrazové syntaxe $(...)nebo výrazu pole @(...) vždy resetovalo $? na hodnotu True. Například (Write-Error) zobrazuje $? jako True. Toto chování se změnilo v PowerShellu 7, aby $? vždy odrážely skutečný úspěch posledního příkazu spuštěného v těchto výrazech.

$^

Obsahuje první token v posledním řádku, který byl přijat během relace.

$_

Stejné jako $PSItem. Obsahuje aktuální objekt v objektu pipeline. 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.

$args

Obsahuje pole hodnot pro nedelarované parametry, které se předávají funkci, skriptu nebo bloku skriptu. Při vytváření funkce můžete deklarovat parametry pomocí klíčového slova param nebo přidáním seznamu parametrů oddělených čárkami do závorek za názvem funkce.

V akci události proměnná $args obsahuje objekty, které představují argumenty zpracovávané události. Tato proměnná se vyplní pouze v rámci Action bloku příkazu pro registraci události. Hodnotu této proměnné lze nalézt také v SourceArgs vlastnost PSEventArgs objektu, který Get-Event vrátí.

$ConsoleFileName

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 použití rutiny Export-Console k exportu názvů modulů snap-in do souboru konzoly.

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.

$EnabledExperimentalFeatures

Obsahuje seznam názvů povolených experimentálních funkcí.

$Error

Obsahuje pole chybových objektů, které představují nejnovější chyby. Nejnovější chyba je první chybový objekt v poli $Error[0].

Chcete-li zabránit přidání chyby do pole $Error, použijte ErrorAction společný parametr s hodnotou Ignorovat. Další informace najdete v části about_CommonParameters.

$Event

Obsahuje PSEventArgs objekt, který představuje událost, která se zpracovává. Tato proměnná se naplní pouze v rámci Action bloku příkazu registrace události, například Register-ObjectEvent. Hodnota této proměnné je stejný objekt, který vrací rutina Get-Event. Vlastnosti proměnné, například Event, můžete použít $Event.TimeGenerated v Action bloku skriptu.

$EventArgs

Obsahuje objekt, který představuje první argument události odvozený z EventArgs události, která se zpracovává. Tato proměnná se vyplní pouze v rámci Action bloku příkazu pro registraci události. Hodnotu této proměnné lze nalézt také v SourceEventArgs vlastnost PSEventArgs objektu, který Get-Event vrátí.

$EventSubscriber

Obsahuje objekt PSEventSubscriber, který představuje odběratele zpracovávané události. Tato proměnná se vyplní pouze v rámci Action bloku příkazu pro registraci události. Hodnota této proměnné je stejný objekt, který vrací rutina Get-EventSubscriber.

$ExecutionContext

Obsahuje EngineIntrinsics objekt, který představuje kontext spuštění hostitele PowerShellu. Tuto proměnnou můžete použít k vyhledání objektů výkonu, které jsou k dispozici pro cmdlety.

$false

Obsahuje false. Tuto proměnnou můžete použít k reprezentaci false v příkazech a skriptech mí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.

$foreach

Obsahuje enumerátor (nikoli výsledné hodnoty) smyčky foreach. Proměnná $foreach existuje pouze v době, kdy je spuštěna smyčka foreach; po 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ů.

$HOME

Obsahuje úplnou cestu domovského adresáře uživatele. Ve Windows tato proměnná používá hodnotu proměnné prostředí "$Env:USERPROFILE" Windows, obvykle C:\Users\<UserName>. V systému Unix tato proměnná používá hodnotu proměnné prostředí HOME.

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".

$Host

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.CurrentCulturenebo $Host.UI.RawUI.BackGroundColor = "Red".

Poznámka

Nastavení barev v $Host.PrivateData byly nahrazeny proměnnou předvoleb $PSStyle. Další informace najdete v tématu about_ANSI_Terminals.

$input

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é skripty).

  • Ve funkci bez begin, processnebo end bloku, $input proměnná vyčíslí kolekci všech vstupů funkce.

  • V bloku begin$input proměnná neobsahuje žádná data.

  • V bloku process obsahuje proměnná $input aktuální objekt v kanálu.

  • V end bloku $input proměnná vyčíslí kolekci všech vstupů funkce.

    Poznámka

    Proměnnou $input uvnitř process bloku i end bloku nemůžete použít ve stejné funkci nebo skriptu.

Vzhledem k tomu, $input je enumerátor, přístup ke všem jeho vlastnostem způsobí, že $input už nebude k dispozici. $input můžete uložit do jiné proměnné a znovu použít vlastnosti $input.

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 příkazu určenému parametrem -Commandpwsh při vyvolání z příkazového řádku. Následující příklad se spustí z příkazového prostředí Windows.

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

$IsCoreCLR

Obsahuje $true, pokud je aktuální relace spuštěná v prostředí .NET Core Runtime (CoreCLR). V opačném případě obsahuje $false.

$IsLinux

Obsahuje $true, pokud je aktuální relace spuštěná v operačním systému Linux. V opačném případě obsahuje $false.

$IsMacOS

Obsahuje $true, pokud je aktuální relace spuštěná v operačním systému macOS. V opačném případě obsahuje $false.

$IsWindows

Obsahuje $true, pokud je aktuální relace spuštěná v operačním systému Windows. V opačném případě obsahuje $false.

$LASTEXITCODE

Obsahuje ukončovací kód posledního nativního programu nebo skriptu PowerShellu, který se spustil.

U skriptů PowerShellu závisí hodnota $LASTEXITCODE na tom, jak byl skript volána, a na tom, jestli se použilo klíčové slovo exit:

  • Pokud skript používá klíčové slovo exit:

    $LASTEXITCODE je nastavena na hodnotu určenou klíčovým slovem exit. Pro více informací viz about_Language_Keywords.

  • Když je skript volán přímo, například ./Test.ps1, nebo pomocí operátoru volání (&) jako & ./Test.ps1:

    Hodnota $LASTEXITCODE se nezmění, pokud:

    • Skript volá jiný skript, který používá klíčové slovo exit.
    • Skript volá nativní příkaz.
    • Skript používá klíčové slovo exit.
  • Při zavolání skriptu s pomocí parametru soubor se nastaví 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 s pomocí parametru command se nastaví na:

    • 1, pokud se skript ukončil z důvodu výjimky, nebo pokud výsledek posledního příkazu nastavil $? na $false
    • 0, pokud se skript úspěšně dokončil a výsledek posledního příkazu nastavil $? na $true

Další informace o parametrech File a Command naleznete v tématu about_Pwsh .

$Matches

Proměnná $Matches pracuje s operátory -match a -notmatch. Když odešlete skalární vstup operátoru -match nebo -notmatch a jeden z nich zjistí shodu, vrátí hodnotu typu Boolean a naplní automatickou proměnnou $Matches hash tabulkou všech řetězcových hodnot, které byly spárovány. Tabulku hash $Matches lze také naplnit výsledky zachycení při použití regulárních výrazů s operátorem -match.

Další informace o operátoru -match naleznete v části about_Comparison_Operators. Pro více informací o regulárních výrazech viz about_Regular_Expressions.

Proměnná $Matches funguje také v příkazu switch s parametrem -Regex. Naplní se stejným způsobem jako operátory -match a -notmatch. Další informace o příkazu switch naleznete v tématu about_Switch.

Poznámka

Když se $Matches vyplní v relaci, 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á v $Matches, dokud se nenajde jiná shoda.

$MyInvocation

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 skriptblocky. 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 má MyInvocation 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 automatických proměnných $PSScriptRoot a $PSCommandPath, vlastnosti PSScriptRoot a PSCommandPath automatické proměnné $MyInvocation obsahují informace o spouštěči nebo o skriptu, který jej volá, nikoli o aktuálním skriptu.

$NestedPromptLevel

Obsahuje aktuální úroveň výzvy. Hodnota 0 označuje původní úroveň výzvy. Hodnota se zvýší při vstupu do vnořené úrovně a při jejím opuštění se sníží.

PowerShell například při použití metody $Host.EnterNestedPrompt 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ň podnětu. Můžete vytvořit alternativní příkazový řádek PowerShellu, který tuto hodnotu obsahuje, aby byla vždy viditelná.

$null

$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 považuje $null za objekt 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 předáte $null proměnnou do rutiny ForEach-Object, vygeneruje hodnotu pro $null, stejně jako u ostatních objektů.

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

V důsledku toho nemůžete použít $null k žádné hodnoty parametru. Hodnota parametru $null přepíše výchozí hodnotu parametru.

Vzhledem k tomu, že PowerShell považuje proměnnou $null za zástupný symbol, můžete ji použít ve skriptech jako v následujícím příkladu, což by nefungovalo, pokud $null byly ignorovány.

$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

Obsahuje identifikátor procesu (PID) procesu, který je hostitelem aktuální relace PowerShellu.

$PROFILE

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.exepomocí příkazu:

notepad.exe $PROFILE

$PSBoundParameters

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. jsou zobrazeny ve formátu klíče 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

$PSCmdlet

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 používané sady parametrů a metoda ShouldProcess přidá WhatIf a Potvrdit parametry do rutiny dynamicky.

Pro více informací o automatické proměnné $PSCmdlet viz téma about_Functions_CmdletBindingAttribute a about_Functions_Advanced.

$PSCommandPath

Obsahuje úplnou cestu a název souboru skriptu, který se spouští. Tato proměnná je platná ve všech skriptech.

$PSCulture

Počínaje PowerShellem 7 $PSCulture odráží kulturu aktuální relace PowerShell. Pokud se kultura změní v PowerShell runspace, aktualizuje se hodnota $PSCulture pro tento runspace.

Kultura určuje formát zobrazení položek, jako jsou čísla, měna a data, a je uložena v System.Globalization.CultureInfo objektu. K zobrazení kultury počítače použijte Get-Culture. $PSCulture obsahuje hodnotu vlastnosti Name.

$PSDebugContext

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í, zda má debugger kontrolu. Když je naplněný, obsahuje objekt PsDebugContext, který má vlastnosti zarážky a InvocationInfo. Vlastnost InvocationInfo má několik užitečných vlastností, včetně vlastnosti Location. Vlastnost Location označuje cestu ke skriptu, který je v procesu ladění.

$PSEdition

Obsahuje stejnou hodnotu v $PSVersionTable.PSEdition. Tato proměnná je k dispozici pro použití v souborech manifestu modulu, zatímco $PSVersionTable není.

$PSHOME

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

$PSItem

Stejné jako $_. Obsahuje aktuální objekt v objektu pipeline. 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.

$PSScriptRoot

Obsahuje úplnou cestu nadřazeného adresáře spuštěného skriptu.

V PowerShellu 2.0 je tato proměnná platná pouze ve skriptových modulech (.psm1). Počínaje PowerShellem 3.0 je platný ve všech skriptech.

$PSSenderInfo

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 vlastnost konfigurovatelnou uživatelem, ApplicationArguments, která ve výchozím nastavení obsahuje pouze $PSVersionTable z původní relace. Chcete-li přidat data do vlastnosti ApplicationArguments, použijte parametr ApplicationArguments rutiny New-PSSessionOption.

Důležitý

Vzhledem k tomu, že tato vlastnost obsahuje data explicitně poskytovaná klientem, může toto použití pro rozhodnutí o zabezpečení umožnit útočníkům obejít autorizační mechanismy. Nikdy tato data nepoužívejte pro rozhodnutí o důvěryhodnosti. Ověřte veškerý uživatelský vstup , pokud se používá pro jinou logiku aplikace.

$PSUICulture

Obsahuje název jazykové verze uživatelského rozhraní (UI), která je nakonfigurovaná v operačním systému. Kultura 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.

$PSVersionTable

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ů na GitHubu
  • Popis operačního systému – operačního systému běžícího na PowerShellu.
  • Platform – 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

$PWD

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 běžících prostorů na proces. Každý runspace má svůj vlastní aktuální adresář. To není stejné jako aktuální adresář procesu: [System.Environment]::CurrentDirectory.

$Sender

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 také nalézt ve vlastnosti Sender objektu PSEventArgs, který vrátí Get-Event.

$ShellId

Obsahuje identifikátor aktuálního prostředí.

$StackTrace

Obsahuje trasování zásobníku pro nejnovější chybu.

$switch

Obsahuje enumerátor, nikoli výsledné hodnoty příkazu switch. Proměnná $switch existuje pouze v době, kdy je spuštěn příkaz switch; po dokončení provádění příkazu switch se odstraní. Další informace naleznete 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ů.

$this

Proměnná $this se používá v scriptblocks, které rozšiřují třídy odkazující na instanci samotné třídy.

Systém ETS (Extensible Type System) PowerShellu umožňuje přidávat vlastnosti do tříd pomocí skriptů. Ve skriptublock, 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í vlastnosti BaseName do třídy 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};}

Další informace naleznete v části about_Types.ps1xml.

Ve třídě PowerShellu proměnná $this 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 skriptů jako delegáty obslužné rutiny události. V tomto scénáři $this představuje objekt pocházející z události, označovaný jako odesílatel události.

$true

Obsahuje true. Tuto proměnnou můžete použít k reprezentaci true v příkazech a skriptech.

Použití výčtů

Proměnné $input, $foreacha $switch jsou všechny výčty používané k iteraci hodnot zpracovaných jejich blokem 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.

  • V rámci smyček by měla být preferována klíčová slova pro řízení toku programu break a continue.

  • V rámci funkcí, které přijímají vstup prostřednictvím datové roury, se doporučuje použít parametry s atributy ValueFromPipeline nebo ValueFromPipelineByPropertyName.

    Další informace naleznete v části about_Functions_Advanced_Parameters.

MoveNext

Metoda MoveNext posune enumerátor k dalšímu prvku kolekce. MoveNext vrátí True pokud byl enumerátor úspěšně přesunut, False pokud enumerátor překročil konec kolekce.

Poznámka

Do výstupního datového proudu se odešle logická hodnota vrácená MoveNext. Výstup můžete potlačit tak, že ho zadáte do [void] nebo ho přepnete na Out-Null .

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

Reset

Metoda Reset nastaví enumerátor na počáteční pozici, která je před prvním prvkem v kolekci.

Current

Vlastnost Current získá prvek v kolekci nebo v potrubí na aktuální pozici enumerátoru.

Vlastnost Current nadále vrací stejnou vlastnost, dokud se MoveNext nevolá.

Examples

Příklad 1: Použití proměnné $input

V následujícím příkladu přístup k proměnné $input vymaže proměnnou, dokud se příště nespustí blok procesu. Pomocí metody Reset resetuje proměnnou $input na aktuální hodnotu pipeline.

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 přepošluje $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

Příklad 2: Použití $input mimo blok procesu

Mimo blok procesu představuje proměnná $input všechny hodnoty předané do funkce.

  • Přístup k proměnné $input 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í metody MoveNext vymaže proměnnou $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:

Příklad 3: Použití vlastnosti $input.Current

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 není nikdy naplněna, pokud výslovně nezavoláte MoveNext. K vlastnosti Current 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

Příklad 4: Použití proměnné $foreach

Na rozdíl od proměnné $input$foreach proměnná vždy představuje všechny položky v kolekci při přímém přístupu. Pomocí vlastnosti Current přistupte k aktuálnímu prvku kolekce a pomocí metod Reset a metody MoveNext změňte 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čí.

Vlastnost MoveNext nemá vliv na proměnnou zvolenou k iteraci v kolekci ($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, metoda Reset je zavolána. Po prvních dvou smyčkách selže příkaz if a smyčka prochází 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

Příklad 5: Použití proměnné $switch

Proměnná $switch má přesně stejná pravidla jako $foreach proměnná. Následující příklad ukazuje všechny koncepty enumerátoru.

Poznámka

Všimněte si, že NotEvaluated případ se nikdy nespustí, i když za metodou break neexistuje žádný příkaz .

$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

Viz také