Udostępnij za pośrednictwem


about_Automatic_Variables

Krótki opis

Opisuje zmienne, które przechowują informacje o stanie programu PowerShell i są tworzone i obsługiwane przez program PowerShell.

Koncepcyjnie większość tych zmiennych jest uważana za tylko do odczytu. Mimo że można je zapisać, w celu zapewnienia zgodności z poprzednimi wersjami nie powinny być zapisywane.

Oto lista zmiennych automatycznych w programie PowerShell:

Długi opis

$$

Zawiera ostatni token w ostatnim wierszu odebrany przez sesję.

$?

Zawiera stan wykonywania ostatniego polecenia. Zawiera wartość True , jeśli ostatnie polecenie powiodło się i false , jeśli nie powiodło się. Analizowanie błędów nie powoduje wykonania, więc nie mają wpływu na wartość $?.

W przypadku poleceń cmdlet i zaawansowanych funkcji, które są uruchamiane na wielu etapach w potoku, na przykład w blokach i process end , wywoływanie this.WriteError() lub $PSCmdlet.WriteError() odpowiednio w dowolnym punkcie ustawia $? wartość False, tak jak this.ThrowTerminatingError() i $PSCmdlet.ThrowTerminatingError().

Polecenie Write-Error cmdlet zawsze ustawia $? wartość False natychmiast po jego wykonaniu, ale nie ustawi $? wartości False dla funkcji wywołującej ją:

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

W tym ostatnim celu $PSCmdlet.WriteError() należy użyć zamiast tego.

W przypadku natywnych poleceń (wykonywalnych) $? jest ustawiona wartość True , gdy $LASTEXITCODE ma wartość 0, i jest ustawiona na wartość Fałsz , gdy $LASTEXITCODE jest dowolną inną wartością.

Uwaga

Do programu PowerShell 7 zawijanie instrukcji w nawiasach (...), składnia $(...)wyrażenia podrzędnego lub wyrażenie @(...) tablicy zawsze ma wartość reset$? True. Na przykład (Write-Error) jest wyświetlana $? wartość True. To zachowanie zmieniło się w programie PowerShell 7, tak aby $? zawsze odzwierciedlało rzeczywisty sukces ostatniego uruchomienia polecenia w tych wyrażeniach.

$^

Zawiera pierwszy token w ostatnim wierszu odebrany przez sesję.

$_

Tak samo jak $PSItem. current Zawiera obiekt w obiekcie potoku. Tej zmiennej można używać w poleceniach, które wykonują akcję na każdym obiekcie w potoku.

Aby uzyskać więcej informacji, zobacz about_PSItem.

$args

Zawiera tablicę wartości dla niezdecydowanych parametrów, które są przekazywane do funkcji, skryptu lub bloku skryptu. Podczas tworzenia funkcji można zadeklarować parametry za pomocą słowa kluczowego param lub dodając rozdzielaną przecinkami listę parametrów w nawiasach po nazwie funkcji.

W akcji zdarzenia zmienna $args zawiera obiekty reprezentujące argumenty zdarzenia przetwarzanego zdarzenia. Ta zmienna jest wypełniana tylko w Action bloku polecenia rejestracji zdarzeń. Wartość tej zmiennej można również znaleźć we właściwości PSEventArgs SourceArgs obiektu, który Get-Event zwraca.

$ConsoleFileName

Zawiera ścieżkę pliku konsoli (.psc1), który był ostatnio używany w sesji. Ta zmienna jest wypełniana podczas uruchamiania programu PowerShell za pomocą parametru PSConsoleFile lub gdy używasz Export-Console polecenia cmdlet do eksportowania nazw przystawek do pliku konsoli.

Jeśli używasz Export-Console polecenia cmdlet bez parametrów, program automatycznie aktualizuje plik konsoli, który był ostatnio używany w sesji. Możesz użyć tej zmiennej automatycznej, aby określić plik do zaktualizowania.

$EnabledExperimentalFeatures

Zawiera listę nazw funkcji eksperymentalnych, które są włączone.

$Error

Zawiera tablicę obiektów błędów reprezentujących najnowsze błędy. Najnowszy błąd to pierwszy obiekt błędu w tablicy $Error[0].

Aby zapobiec dodaniu błędu do tablicy, użyj wspólnego parametru $Error ErrorAction z wartością Ignore. Aby uzyskać więcej informacji, zobacz about_CommonParameters.

$Event

PSEventArgs Zawiera obiekt reprezentujący przetwarzane zdarzenie. Ta zmienna jest wypełniana tylko w Action bloku polecenia rejestracji zdarzeń, takiego jak Register-ObjectEvent. Wartość tej zmiennej jest tym samym obiektem, który Get-Event zwraca polecenie cmdlet. Możesz użyć właściwości zmiennej Event , takiej jak $Event.TimeGenerated, w Action bloku skryptu.

$EventArgs

Zawiera obiekt reprezentujący pierwszy argument zdarzenia, który pochodzi z eventArgs zdarzenia, które jest przetwarzane. Ta zmienna jest wypełniana tylko w Action bloku polecenia rejestracji zdarzeń. Wartość tej zmiennej można również znaleźć we właściwości PSEventArgs SourceEventArgs obiektu, który Get-Event zwraca.

$EventSubscriber

PSEventSubscriber Zawiera obiekt reprezentujący subskrybenta zdarzenia przetwarzanego zdarzenia. Ta zmienna jest wypełniana tylko w Action bloku polecenia rejestracji zdarzeń. Wartość tej zmiennej jest tym samym obiektem, który Get-EventSubscriber zwraca polecenie cmdlet.

$ExecutionContext

Zawiera obiekt EngineIntrinsics reprezentujący kontekst wykonywania hosta programu PowerShell. Za pomocą tej zmiennej można znaleźć obiekty wykonywania, które są dostępne dla poleceń cmdlet.

$false

Zawiera wartość False. Tej zmiennej można użyć do reprezentowania wartości False w poleceniach i skryptach zamiast używać ciągu "false". Ciąg może być interpretowany jako True , jeśli jest konwertowany na ciąg niepusty lub do liczby całkowitej innej niż zero.

$foreach

Zawiera moduł wyliczający (a nie wartości wynikowe) pętli ForEach . Zmienna $ForEach istnieje tylko wtedy, gdy ForEach pętla jest uruchomiona; jest usuwana po zakończeniu pętli.

Moduły wyliczania zawierają właściwości i metody, których można użyć do pobierania wartości pętli i zmiany current iteracji pętli. Aby uzyskać więcej informacji, zobacz Using Enumerators (Korzystanie z modułów wyliczania).

$HOME

Zawiera pełną ścieżkę katalogu macierzystego użytkownika. W systemie Windows ta zmienna używa wartości zmiennej środowiskowej "$env:USERPROFILE" systemu Windows, zazwyczaj C:\Users\<UserName>. W systemie Unix ta zmienna używa wartości zmiennej środowiskowej HOME .

Ważne

System Windows może przekierować lokalizację profilu użytkownika. Oznacza to, że $HOME może nie mieć takiej samej wartości jak "$env:HOMEDRIVE$env:HOMEPATH".

$Host

Zawiera obiekt reprezentujący aplikację current hosta dla programu PowerShell. Tej zmiennej można użyć do reprezentowania current hosta w poleceniach lub wyświetlania lub zmieniania właściwości hosta, takich jak $Host.version lub , $Host.CurrentCulturelub $Host.UI.RawUI.BackGroundColor = "Red".

Uwaga

Ustawienia kolorów w pliku $Host.PrivateData zostały zastąpione przez zmienną $PSStyle preferencji. Aby uzyskać więcej informacji, zobacz about_ANSI_Terminals.

$input

Zawiera moduł wyliczający wszystkie dane wejściowe przekazywane do funkcji. Zmienna $input jest dostępna tylko dla funkcji, bloków skryptów (które są nienazwanych funkcjami) i plików skryptów (które są zapisanymi blokami skryptów).

  • W funkcji bez beginelementu , processlub end bloku $input zmienna wylicza kolekcję wszystkich danych wejściowych funkcji.

  • begin W bloku zmienna $input nie zawiera żadnych danych.

  • process W bloku zmienna $input zawiera current obiekt w potoku.

  • end W bloku zmienna $input wylicza kolekcję wszystkich danych wejściowych funkcji.

    Uwaga

    Nie można użyć zmiennej $input wewnątrz process bloku i end bloku w tej samej funkcji lub bloku skryptu.

Ponieważ $input jest modułem wyliczającym, uzyskanie dostępu do dowolnego z jego właściwości powoduje $input , że nie będzie już dostępny. Możesz przechowywać $input w innej zmiennej w celu ponownego $input użycia właściwości.

Moduły wyliczania zawierają właściwości i metody, których można użyć do pobierania wartości pętli i zmiany current iteracji pętli. Aby uzyskać więcej informacji, zobacz Using Enumerators (Korzystanie z modułów wyliczania).

Zmienna $input jest również dostępna dla polecenia określonego -Command przez parametr pwsh w przypadku wywołania z wiersza polecenia. Poniższy przykład jest uruchamiany z powłoki poleceń systemu Windows.

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

$IsCoreCLR

Zawiera $true , czy sesja current jest uruchomiona w środowisku uruchomieniowym platformy .NET Core (CoreCLR). W przeciwnym razie zawiera $falsewartość .

$IsLinux

Zawiera $true , czy sesja current jest uruchomiona w systemie operacyjnym Linux. W przeciwnym razie zawiera $falsewartość .

$IsMacOS

Zawiera $true informacje o tym, czy sesja current jest uruchomiona w systemie operacyjnym MacOS. W przeciwnym razie zawiera $falsewartość .

$IsWindows

Zawiera $true , czy sesja current jest uruchomiona w systemie operacyjnym Windows. W przeciwnym razie zawiera $falsewartość .

$LASTEXITCODE

Zawiera kod zakończenia ostatniego natywnego programu lub skryptu programu PowerShell, który został uruchomiony.

W przypadku skryptów programu PowerShell wartość $LASTEXITCODE zależy od sposobu wywoływanego skryptu i tego, czy exit słowo kluczowe zostało użyte:

  • Gdy skrypt używa słowa kluczowego exit :

    $LASTEXITCODE jest ustawiona na wartość określoną przez exit słowo kluczowe. Aby uzyskać więcej informacji, zobacz about_Language_Keywords.

  • Gdy skrypt jest wywoływany bezpośrednio, na przykład ./Test.ps1, lub za pomocą operatora wywołania (&), takiego jak & ./Test.ps1:

    Wartość nie zostanie zmieniona $LASTEXITCODE , chyba że:

    • Skrypt wywołuje inny skrypt, który używa słowa kluczowego exit
    • Skrypt wywołuje natywne polecenie
    • Skrypt używa słowa kluczowego exit
  • Gdy skrypt jest wywoływany pwsh przy użyciu parametru File , $LASTEXITCODE jest ustawiony na:

    • 1 jeśli skrypt został zakończony z powodu wyjątku
    • Wartość określona exit przez słowo kluczowe , jeśli jest używana w skry skrycie
    • 0 jeśli skrypt został ukończony pomyślnie
  • Gdy skrypt jest wywoływany pwsh przy użyciu parametru Command , $LASTEXITCODE jest ustawiony na:

    • 1 jeśli skrypt został zakończony z powodu wyjątku lub jeśli wynik ostatniego polecenia jest ustawiony $? na $false
    • 0 jeśli skrypt został ukończony pomyślnie i wynik ostatniego polecenia ustawionego $? na $true

Aby uzyskać więcej informacji na temat parametrów Plik i Polecenie , zobacz about_Pwsh.

$Matches

Zmienna $Matches działa z operatorami -match i -notmatch . Po przesłaniu -match danych wejściowych skalarnych do operatora or -notmatch i wykryciu dopasowania zwracają wartość logiczną i wypełniają $Matches zmienną automatyczną tabelą skrótów dowolnych wartości ciągów, które zostały dopasowane. Tabelę $Matches skrótów można również wypełnić przy użyciu przechwytywania, gdy używasz wyrażeń regularnych z operatorem -match .

Aby uzyskać więcej informacji na temat -match operatora, zobacz about_Comparison_Operators. Aby uzyskać więcej informacji na temat wyrażeń regularnych, zobacz about_Regular_Expressions.

Zmienna $Matches działa również w instrukcji switch z parametrem -Regex . Jest on wypełniany w taki sam sposób, jak -match operatory i -notmatch . Aby uzyskać więcej informacji na temat instrukcji switch , zobacz about_Switch.

Uwaga

Po $Matches wypełnieniu w sesji zachowuje dopasowaną wartość, dopóki nie zostanie zastąpiona przez inne dopasowanie. Jeśli -match zostanie ponownie użyty i nie zostanie znalezione dopasowanie, nie reset$Matches ma wartości $null. Wcześniej dopasowana wartość jest przechowywana do $Matches momentu znalezienia innego dopasowania.

$MyInvocation

Zawiera informacje o poleceniu current , takie jak nazwa, parametry, wartości parametrów i informacje o tym, jak polecenie zostało uruchomione, wywoływane lub wywoływane, takie jak nazwa skryptu, który nazwał current polecenie.

$MyInvocation Jest wypełniany tylko dla skryptów, funkcji i bloków skryptów. Możesz użyć informacji w obiekcie System.Management.Automation.InvocationInfo zwracanym $MyInvocation w current skrypcie, takim jak nazwa funkcji ($MyInvocation.MyCommand.Name), aby zidentyfikować current polecenie. Jest to przydatne w przypadku znajdowania nazwy skryptu current .

Począwszy od programu PowerShell 3.0, MyInvocation ma następujące nowe właściwości.

  • PSScriptRoot — zawiera pełną ścieżkę do skryptu current , który wywołał polecenie. Wartość tej właściwości jest wypełniana tylko wtedy, gdy obiekt wywołujący jest skryptem.
  • PSCommandPath — zawiera pełną ścieżkę i nazwę pliku skryptu current , który wywołał polecenie. Wartość tej właściwości jest wypełniana tylko wtedy, gdy obiekt wywołujący jest skryptem.

$PSScriptRoot W przeciwieństwie do zmiennych automatycznych i $PSCommandPath właściwości $MyInvocation PSScriptRoot i PSCommandPath zmiennej automatycznej zawierają informacje o wywoływaniu lub wywoływaniu skryptu, a nie skryptucurrent.

$NestedPromptLevel

Zawiera poziom monitu current . Wartość 0 wskazuje oryginalny poziom monitu. Wartość jest zwiększana po wprowadzeniu zagnieżdżonego poziomu i dekrementacji po jej zakończeniu.

Na przykład program PowerShell przedstawia zagnieżdżony wiersz polecenia podczas korzystania z $Host.EnterNestedPrompt metody . Program PowerShell przedstawia również zagnieżdżony wiersz polecenia po osiągnięciu punktu przerwania w debugerze programu PowerShell.

Po wprowadzeniu zagnieżdżonego wiersza polecenia program PowerShell wstrzymuje current polecenie, zapisuje kontekst wykonywania i zwiększa wartość zmiennej $NestedPromptLevel . Aby utworzyć dodatkowe zagnieżdżone wiersze polecenia (do 128 poziomów) lub wrócić do oryginalnego wiersza polecenia, ukończ polecenie lub wpisz exit.

Zmienna $NestedPromptLevel ułatwia śledzenie poziomu monitu. Możesz utworzyć alternatywny wiersz polecenia programu PowerShell zawierający tę wartość, aby zawsze był widoczny.

$null

$nullto zmienna automatyczna zawierająca wartość null lub pustą. Tej zmiennej można użyć do reprezentowania nieobecnej lub niezdefiniowanej wartości w poleceniach i skryptach.

Program PowerShell traktuje $null jako obiekt z wartością lub symbol zastępczy, dzięki czemu można użyć $null do reprezentowania pustej wartości w kolekcji wartości.

Na przykład jeśli $null element jest uwzględniony w kolekcji, jest on liowany jako jeden z obiektów.

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

W przypadku potoku zmiennej $null do ForEach-Object polecenia cmdlet program generuje wartość , $nullpodobnie jak w przypadku innych obiektów

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

W związku z tym nie można użyć $null polecenia , aby nie oznaczać żadnej wartości parametru. Wartość parametru zastępuje wartość parametru $null domyślnego.

Jednak ponieważ program PowerShell traktuje $null zmienną jako symbol zastępczy, można go użyć w skryptach takich jak poniższy, co nie zadziałałoby, gdyby $null zostały zignorowane.

$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

Zawiera identyfikator procesu (PID) procesu hostujący sesję current programu PowerShell.

$PROFILE

Zawiera pełną ścieżkę profilu programu PowerShell dla current użytkownika i current aplikacji hosta. Tej zmiennej można użyć do reprezentowania profilu w poleceniach. Można na przykład użyć go w poleceniu, aby określić, czy profil został utworzony:

Test-Path $PROFILE

Możesz też użyć go w poleceniu, aby utworzyć profil:

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

Możesz go użyć w poleceniu, aby otworzyć profil w notepad.exe:

notepad.exe $PROFILE

$PSBoundParameters

Zawiera słownik parametrów przekazywanych do skryptu lub funkcji oraz ich current wartości. Ta zmienna ma wartość tylko w zakresie, w którym są deklarowane parametry, takie jak skrypt lub funkcja. Można go użyć do wyświetlania lub zmieniania current wartości parametrów lub przekazywania wartości parametrów do innego skryptu lub funkcji.

W tym przykładzie funkcja Test2 przekazuje $PSBoundParameters element do funkcji Test1 . Wartości $PSBoundParameters są wyświetlane w formacie Klucz i Wartość.

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

Zawiera obiekt reprezentujący polecenie cmdlet lub funkcję zaawansowaną, która jest uruchamiana.

Możesz użyć właściwości i metod obiektu w kodzie polecenia cmdlet lub funkcji, aby reagować na warunki użycia. Na przykład właściwość ParameterSetName zawiera nazwę używanego zestawu parametrów, a metoda ShouldProcess dodaje parametry WhatIf i Confirm do polecenia cmdlet dynamicznie.

Aby uzyskać więcej informacji na temat zmiennej automatycznej $PSCmdlet , zobacz about_Functions_CmdletBindingAttribute i about_Functions_Advanced.

$PSCommandPath

Zawiera pełną ścieżkę i nazwę pliku skryptu, który jest uruchamiany. Ta zmienna jest prawidłowa we wszystkich skryptach.

$PSCulture

Począwszy od programu PowerShell 7, $PSCulture odzwierciedla kulturę przestrzeni uruchomieniowej current programu PowerShell (sesja). Jeśli kultura zostanie zmieniona w przestrzeni uruchomieniowej programu PowerShell, zostanie zaktualizowana $PSCulture wartość dla tego obszaru uruchomieniowego.

Kultura określa format wyświetlania elementów, takich jak liczby, waluta i daty, i jest przechowywany w obiekcie System.Globalization.CultureInfo . Służy Get-Culture do wyświetlania kultury komputera. $PSCulturezawiera wartość właściwości Name.

$PSDebugContext

Podczas debugowania ta zmienna zawiera informacje o środowisku debugowania. W przeciwnym razie zawiera wartość null . W związku z tym można go użyć do określenia, czy debuger ma kontrolę. Po wypełnieniu zawiera on obiekt PsDebugContext zawierający właściwości Punkty przerwania i InvocationInfo . Właściwość InvocationInfo ma kilka przydatnych właściwości, w tym właściwość Location . Właściwość Location wskazuje ścieżkę skryptu, który jest debugowany.

$PSEdition

Zawiera tę samą wartość w pliku $PSVersionTable.PSEdition. Ta zmienna jest dostępna do użycia w plikach manifestu modułu, natomiast $PSVersionTable nie jest.

$PSHOME

Zawiera pełną ścieżkę katalogu instalacyjnego programu PowerShell, zazwyczaj C:\Program Files\PowerShell\7 w systemach Windows. Tej zmiennej można używać w ścieżkach plików programu PowerShell. Na przykład następujące polecenie wyszukuje tematy koncepcyjne Pomocy dla słowa Pomoc:

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

$PSItem

Tak samo jak $_. current Zawiera obiekt w obiekcie potoku. Tej zmiennej można używać w poleceniach, które wykonują akcję na każdym obiekcie w potoku.

Aby uzyskać więcej informacji, zobacz about_PSItem.

$PSScriptRoot

Zawiera pełną ścieżkę katalogu nadrzędnego wykonywania skryptu.

W programie PowerShell 2.0 ta zmienna jest prawidłowa tylko w modułach skryptów (.psm1). Począwszy od programu PowerShell 3.0, jest on prawidłowy we wszystkich skryptach.

$PSSenderInfo

Zawiera informacje o użytkowniku, który uruchomił program PSSession, w tym tożsamość użytkownika i strefę czasową komputera źródłowego. Ta zmienna jest dostępna tylko w programie PSSessions.

Zmienna $PSSenderInfo zawiera właściwość, którą można skonfigurować przez użytkownika, ApplicationArguments, która domyślnie zawiera tylko $PSVersionTable właściwość z sesji źródłowej. Aby dodać dane do właściwości ApplicationArguments , użyj parametru ApplicationArguments polecenia New-PSSessionOption cmdlet.

$PSUICulture

Zawiera nazwę kultury interfejsu użytkownika skonfigurowanej w systemie operacyjnym. Kultura interfejsu użytkownika określa, które ciągi tekstowe są używane dla elementów interfejsu użytkownika, takich jak menu i komunikaty. Jest to wartość właściwości System.Globalization.CultureInfo.CurrentUICulture.Name systemu. Aby uzyskać obiekt System.Globalization.CultureInfo dla systemu, użyj Get-UICulture polecenia cmdlet .

$PSVersionTable

Zawiera tabelę skrótów tylko do odczytu zawierającą szczegółowe informacje o wersji programu PowerShell uruchomionej current w sesji. Tabela zawiera następujące elementy:

  • PSVersion — numer wersji programu PowerShell
  • PSEdition Ta właściwość ma wartość "Desktop" dla programu PowerShell 4 i poniżej, a także program PowerShell 5.1 w pełni funkcjonalnych wersjach systemu Windows. Ta właściwość ma wartość Core dla programu PowerShell 6 i nowszych, a także środowiska Windows PowerShell 5.1 w przypadku ograniczonych wersji, takich jak Windows Nano Server lub Windows IoT.
  • GitCommitId — identyfikator zatwierdzenia plików źródłowych w usłudze GitHub
  • System operacyjny — opis systemu operacyjnego, na którym działa program PowerShell.
  • Platform — platforma, na którą działa system operacyjny. Wartość w systemach Linux i macOS to Unix. Zobacz $IsMacOs i $IsLinux.
  • PSCompatibleVersions — wersje programu PowerShell, które są zgodne z wersją current
  • PSRemotingProtocolVersion — wersja protokołu zdalnego zarządzania programu PowerShell.
  • SerializationVersion — wersja metody serializacji
  • WSManStackVersion — numer wersji stosu zarządzania WS-Management

$PWD

Zawiera obiekt ścieżki reprezentujący pełną ścieżkę current lokalizacji katalogu dla obszaru uruchomieniowego current programu PowerShell.

Uwaga

Program PowerShell obsługuje wiele obszarów runspace na proces. Każdy obszar uruchamiania ma własny current katalog. Nie jest to samo, co current katalog procesu: [System.Environment]::CurrentDirectory.

$Sender

Zawiera obiekt, który wygenerował to zdarzenie. Ta zmienna jest wypełniana tylko w bloku Akcja polecenia rejestracji zdarzeń. Wartość tej zmiennej można również znaleźć we właściwości PSEventArgs Sender obiektu, który Get-Event zwraca.

$ShellId

Zawiera identyfikator powłoki current .

$StackTrace

Zawiera ślad stosu dla ostatniego błędu.

$switch

Zawiera moduł wyliczający, a nie wynikowe wartości instrukcji Switch . Zmienna $switch istnieje tylko wtedy, gdy Switch instrukcja jest uruchomiona; jest usuwana po zakończeniu switch wykonywania instrukcji. Aby uzyskać więcej informacji, zobacz about_Switch.

Moduły wyliczania zawierają właściwości i metody, których można użyć do pobierania wartości pętli i zmiany current iteracji pętli. Aby uzyskać więcej informacji, zobacz Using Enumerators (Korzystanie z modułów wyliczania).

$this

Zmienna $this jest używana w blokach skryptów, które rozszerzają klasy w celu odwoływania się do wystąpienia samej klasy.

Rozszerzalny system typów programu PowerShell (ETS) umożliwia dodawanie właściwości do klas przy użyciu bloków skryptów. W bloku skryptu definiującym właściwość skryptu lub metodę skryptu zmienna odwołuje się do wystąpienia obiektu klasy, $this która jest rozszerzana. Na przykład program PowerShell używa systemu ETS do dodania właściwości BaseName do klasy 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};}

Aby uzyskać więcej informacji, zobacz about_Types.ps1xml.

W klasie programu PowerShell zmienna $this odwołuje się do obiektu wystąpienia samej klasy, umożliwiając dostęp do właściwości i metod zdefiniowanych w klasie. Aby uzyskać więcej informacji, zobacz about_Classes.

Zmienna $this jest również używana przez klasy zdarzeń platformy .NET, które przyjmują bloki skryptów jako delegaty dla programu obsługi zdarzeń. W tym scenariuszu $this reprezentuje obiekt pochodzący ze zdarzenia, znany jako nadawca zdarzeń.

$true

Zawiera wartość True. Tej zmiennej można użyć do reprezentowania wartości True w poleceniach i skryptach.

Korzystanie z modułów wyliczania

Zmienne $input, $foreachi $switch to wszystkie moduły wyliczające używane do iterowania wartości przetworzonych przez ich blok zawierający kod.

Moduł wyliczający zawiera właściwości i metody, których można użyć do przechodzenia lub reset iteracji albo pobierania wartości iteracji. Bezpośrednie manipulowanie modułami wyliczającym nie jest uważane za najlepsze rozwiązanie.

  • W pętlach preferowane powinny być słowa kluczowe sterowania przepływem.

  • W funkcjach, które akceptują dane wejściowe potoku, najlepszym rozwiązaniem jest użycie parametrów z atrybutami ValueFromPipeline lub ValueFromPipelineByPropertyName.

    Aby uzyskać więcej informacji, zobacz about_Functions_Advanced_Parameters.

MoveNext

Metoda MoveNext rozwija moduł wyliczający do następnego elementu kolekcji. Funkcja MoveNext zwraca True wartość , jeśli moduł wyliczający został pomyślnie zaawansowany, False jeśli moduł wyliczający przeszedł koniec kolekcji.

Uwaga

Wartość logiczna zwracana przez funkcję MoveNext jest wysyłana do strumienia wyjściowego. Dane wyjściowe można pominąć przez wpisanie danych wyjściowych do [void] lub przesyłanie potokowe do wartości Out-Null.

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

Reset

Metoda Reset ustawia moduł wyliczający na swoją pozycję początkową, która znajduje się przed pierwszym elementem w kolekcji.

Current

Właściwość Current pobiera element w kolekcji lub potoku na current pozycji modułu wyliczającego.

Właściwość Current nadal zwraca tę samą właściwość do momentu wywołania metody MoveNext .

Przykłady

Przykład 1. Używanie zmiennej $input

W poniższym przykładzie uzyskanie $input dostępu do zmiennej usuwa zmienną do następnego uruchomienia bloku procesu. Reset Użycie metody resetuje zmienną $input do wartości potokucurrent.

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 automatycznie zwiększa zmienną $input , nawet jeśli nie uzyskujesz do niej dostępu.

$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

Przykład 2: Używanie $input poza blokiem procesu

Poza blokiem procesu zmienna $input reprezentuje wszystkie wartości przesyłane potokiem do funkcji.

  • Uzyskiwanie dostępu do zmiennej $input usuwa wszystkie wartości.
  • Metoda Reset resetuje całą kolekcję.
  • Właściwość Current nigdy nie jest wypełniana.
  • Metoda MoveNext zwraca wartość false, ponieważ nie można zaawansowanej kolekcji.
    • Wywołanie metody MoveNext czyści zmienną $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:

Przykład 3. Używanie $input.Current własność

Za pomocą właściwości można uzyskać dostęp do wartości potoku Current current wiele razy bez użycia Reset metody . Blok procesu nie wywołuje automatycznie metody MoveNext .

Właściwość Current nigdy nie jest wypełniana, chyba że jawnie wywołasz metodę MoveNext. Dostęp Current do właściwości można uzyskać wiele razy w bloku procesu bez wyczyszczenia jej wartości.

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

Przykład 4. Używanie zmiennej $foreach

W przeciwieństwie do zmiennej $input zmienna $foreach zawsze reprezentuje wszystkie elementy w kolekcji, gdy uzyskujesz bezpośredni dostęp. Current Użyj właściwości , aby uzyskać dostęp do current elementu kolekcji, oraz Reset metody MoveNext, aby zmienić jego wartość.

Uwaga

Każda iteracja foreach pętli automatycznie wywołuje metodę MoveNext .

Poniższa pętla jest wykonywana tylko dwa razy. W drugiej iteracji kolekcja zostanie przeniesiona do trzeciego elementu przed ukończeniem iteracji. Po drugiej iteracji nie ma już żadnych wartości do iteracji, a pętla kończy się.

Właściwość MoveNext nie ma wpływu na zmienną wybraną do iterowania przez kolekcję ($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 Użycie metody resetuje current element w kolekcji. Poniższy przykład wykonuje pętle przez dwa pierwsze elementy , ponieważ metoda jest wywoływana Reset . Po dwóch pierwszych pętlach if instrukcja kończy się niepowodzeniem, a pętla iteruje przez wszystkie trzy elementy normalnie.

Ważne

Może to spowodować nieskończoną pętlę.

$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

Przykład 5. Używanie zmiennej $switch

Zmienna $switch ma dokładnie te same reguły co zmienna $foreach . W poniższym przykładzie przedstawiono wszystkie koncepcje modułu wyliczającego.

Uwaga

Zwróć uwagę, że przypadek NotEvaluated nigdy nie jest wykonywany, mimo że nie ma break instrukcji po metodzie 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

Zobacz też