Sdílet prostřednictvím


about_Automatic_Variables

Krátký popis

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:

Dlouhý popis

$$

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í this.WriteError() nebo $PSCmdlet.WriteError() v libovolném bodě se nastaví $? na False, stejně jako this.ThrowTerminatingError() i $PSCmdlet.ThrowTerminatingError().end

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:

Dokud PowerShell 7, zabalení příkazu v závorkách (...), subexpression syntaxe $(...)nebo maticový výraz @(...) vždy resetovat $? 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.

$args

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

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

$EnabledExperimentalFeatures

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

$Error

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.

$Event

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.TimeGenerated, můžete použít Event v Action bloku skriptu.

$EventArgs

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

$EventSubscriber

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

$ExecutionContext

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.

$false

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.

$foreach

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

$HOME

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

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

Poznámka:

Nastavení barev byla $Host.PrivateData nahrazena proměnnou $PSStyle předvoleb. 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é bloky skriptu).

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

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

  • process V bloku $input proměnná obsahuje 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 i end 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!"""

$IsCoreCLR

Obsahuje $true , jestli je aktuální relace spuštěná v prostředí .NET Core Runtime (CoreCLR). Jinak obsahuje $false.

$IsLinux

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

$IsMacOS

Obsahuje $true , jestli je aktuální relace spuštěná v operačním systému MacOS. Jinak obsahuje $false.

$IsWindows

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

$LASTEXITCODE

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 slovem exit . Další informace najdete v tématu about_Language_Keywords.

  • Pokud je skript volána přímo, například , nebo ./Test.ps1pomocí 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.
  • Při zavolání skriptu pomocí pwsh parametru $LASTEXITCODE File 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 $LASTEXITCODE Command 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.

$Matches

Proměnná $Matches pracuje s operátory a -notmatch operátory-match. 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 -notmatch operátory-match. 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 -match se znovu použije a nenajde se žádná shoda, neobnoví $Matches se na $null. Dříve spárovaná hodnota se uchová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 bloky skriptů. K identifikaci aktuálního příkazu můžete použít informace v objektu System.Management.Automation.InvocationInfo, který $MyInvocation se vrátí 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.

$PSScriptRoot Na rozdíl od automatických $PSCommandPath proměnných obsahují vlastnosti $MyInvocation PSScriptRoot a PSCommandPath automatické proměnné informace o volajícím nebo volajícím skriptu, 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ýší, 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 $NestedPromptLevel proměnné. 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

$nullje 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ě $nulljako 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

$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.exe pomocí 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 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

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

$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áží jazykovou verzi aktuálního prostředí PowerShell runspace (relace). 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. $PSCultureobsahuje 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í, 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ý.

$PSEdition

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

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

$PSScriptRoot

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.

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

$PSUICulture

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 System.Globalization.CultureInfo.Current UICulture.Name vlastnost 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ů 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

$PWD

Obsahuje objekt cesty, který představuje úplnou cestu k aktuálnímu umístění adresáře pro aktuální prostředí Runspace Prostředí PowerShell.

Poznámka:

PowerShell podporuje více prostředí runspace na proces. Každý runspace má svůj vlastní aktuální adresář. Nejedná se o stejný adresář 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 nalézt také ve vlastnosti Sender objektu PSEventArgs , který Get-Event vrací.

$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 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ů.

$this

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.

$true

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

Použití enumerátorů

Proměnné $inputa , $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.

MoveNext

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()

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 kanálu na aktuální pozici enumerátoru.

Tato Current vlastnost bude nadále vracet stejnou vlastnost, dokud MoveNext není volána.

Příklady

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

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

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

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

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 .
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í $inputCurrent vlastnost

Current S vlastností lze k aktuální hodnotě kanálu přistupovat vícekrát bez použití Reset metody. 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

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

$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. Current Použijte vlastnost pro přístup k current collection element 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

Reset Použití metody 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

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

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

Viz také