3. Podstawowe pojęcia

3.1 Dostawcy i dyski

Dostawca umożliwia dostęp do danych i składników, które w przeciwnym razie nie byłyby łatwo dostępne w wierszu polecenia. Dane są prezentowane w spójnym formacie, który przypomina dysk systemu plików.

Dane udostępniane przez dostawcę są wyświetlane na dysku, a dostęp do danych jest uzyskiwany za pośrednictwem ścieżki, podobnie jak w przypadku dysku. Wbudowane polecenia cmdlet dla każdego dostawcy zarządzają danymi na dysku dostawcy.

Program PowerShell zawiera następujący zestaw wbudowanych dostawców, którzy mają dostęp do różnych typów magazynów danych:

Dostawca Nazwa dysku Opis Ref.
Alias Alias: Aliasy programu PowerShell .3.1.1
Środowisko Env: Zmienne środowiskowe .3.1.2
FileSystem A:, B:, C:, ... Dyski, katalogi i pliki .3.1.3
Funkcja Funkcja: Funkcje programu PowerShell .3.1.4
Zmienna Zmiennej: Zmienne programu PowerShell .3.1.5

Windows PowerShell:

Dostawca Nazwa dysku Opis
Certyfikat Cert: Certyfikaty x509 dla podpisów cyfrowych
Rejestr HKLM: (HKEY_LOCAL_MACHINE), HKCU: (HKEY_CURRENT_USER) Windows rejestru
Wsman Wsman: WS-Management konfiguracji

Następujące polecenia cmdlet dotyczą dostawców i dysków:

  • Get-PSProvider: pobiera informacje o co najmniej jednym dostawcy
  • Get-PSDrive: pobiera informacje o co najmniej jednym dysku

Typ obiektu, który reprezentuje dostawcę, jest opisany w .4.5.1. Typ obiektu, który reprezentuje dysk jest opisany w .4.5.2.

3.1.1 Aliasy

Alias jest alternatywną nazwą polecenia. Polecenie może mieć wiele aliasów, a oryginalna nazwa i wszystkie jego aliasy mogą być używane zamiennie. Alias można ponownie przypisać. Alias jest elementem (";3.3).

Alias można przypisać do innego aliasu; Jednak nowy alias nie jest aliasem oryginalnego polecenia.

Alias dostawcy to płaska przestrzeń nazw, która zawiera tylko obiekty reprezentujące aliasy. Zmienne nie mają elementów podrzędnych.

Niektóre aliasy są wbudowane w program PowerShell.

Następujące polecenia cmdlet zajmują się aliasami:

  • New-Alias: tworzy alias
  • Set-Alias: tworzy lub zmienia co najmniej jeden alias
  • Get-Alias: pobiera informacje o co najmniej jednym aliasie
  • Export-Alias: eksportuje co najmniej jeden alias do pliku

Po utworzeniu aliasu dla polecenia przy użyciu New-Aliaspolecenia nie można do nich dotworzyć parametrów tego polecenia. Jednak bezpośrednie przypisanie do zmiennej w obszarze nazw Alias: umożliwia uwzględnianie parametrów.

Uwaga

Jednak utworzenie funkcji, która nie zawiera tylko wywołania tego polecenia ze wszystkimi wymaganymi parametrami i przypisanie aliasu do tej funkcji, jest proste.

Typ obiektu, który reprezentuje alias, jest opisany w .4.5.4.

Obiekty aliasu są przechowywane na dysku Alias: (3.1).

3.1.2 Zmienne środowiskowe

Dostawca środowiska programu PowerShell umożliwia pobieranie, dodanie, zmiana, wyczyszczenie i usunięcie zmiennych środowiskowych systemu operacyjnego.

Środowisko dostawcy to płaska przestrzeń nazw zawierająca tylko obiekty reprezentujące zmienne środowiskowe. Zmienne nie mają elementów podrzędnych.

Nazwa zmiennej środowiskowej nie może zawierać znaku równości (=).

Zmiany zmiennych środowiskowych mają wpływ tylko na bieżącą sesję.

Zmienna środowiskowa jest elementem (";3.3).

Typ obiektu, który reprezentuje zmienną środowiskową, jest opisany w .4.5.6.

Obiekty zmiennych środowiskowych są przechowywane na dysku Env: ([3.1).

3.1.3 System plików

Dostawca systemu plików programu PowerShell umożliwia tworzenie, otwarcie, zmiana i usunięcie katalogów i plików.

Dostawca systemu plików to hierarchiczna przestrzeń nazw zawierająca obiekty reprezentujące bazowy system plików.

Pliki są przechowywane na dyskach o nazwach takich jak A:, B:, C:itd. ([3.1]. Dostęp do katalogów i plików można uzyskać za pomocą notacji ścieżki (";3.4).

Katalog lub plik jest elementem (";3.3).

3.1.4 Funkcje

Dostawca funkcji programu PowerShell umożliwia pobieranie, dodanie, zmiana, wyczyszczenie i usunięcie funkcji i filtrów ([8.10.1]).

Funkcja provider to płaska przestrzeń nazw, która zawiera tylko obiekty funkcji i filtru. Ani funkcje, ani filtry nie mają elementów podrzędnych.

Zmiany funkcji mają wpływ tylko na bieżącą sesję.

Funkcja jest elementem (";3.3).

Typ obiektu, który reprezentuje funkcję, jest opisany w .4.5.10. Typ obiektu, który reprezentuje filtr, jest opisany w .4.5.11.

Obiekty funkcji są przechowywane na dysku funkcja: (3.1).

3.1.5 Zmienne

Zmienne można zdefiniować i manipulować nimi bezpośrednio w języku programu PowerShell.

Zmienna dostawcy to płaska przestrzeń nazw zawierająca tylko obiekty reprezentujące zmienne. Zmienne nie mają elementów podrzędnych.

Następujące polecenia cmdlet również zajmują się zmiennymi:

Zmienna jest elementem ();3.3), dlatego może być modyfikowana przez większość polecenia cmdlet związanych z elementami.

Typ obiektu, który reprezentuje zmienną, jest opisany w .4.5.3.

Obiekty zmiennych są przechowywane na dysku zmienna: (";3.1).

3.2 Lokalizacje robocze

Bieżąca lokalizacja robocza jest domyślną lokalizacją, do której wskazują polecenia. Jest to lokalizacja używana, jeśli jawna ścieżka (zestawie 3.4) nie zostanie dostarczona podczas wywoływania polecenia. Ta lokalizacja zawiera bieżący dysk.

Host programu PowerShell może mieć wiele dysków. W takim przypadku każdy dysk ma własną bieżącą lokalizację.

Gdy nazwa dysku jest określony bez katalogu, bieżąca lokalizacja dla tego dysku jest implikowana.

Bieżącą lokalizację roboczą można zapisać na stosie, a następnie ustawić na nową lokalizację. Później można przywrócić zapisaną lokalizację z tego stosu i ustawić bieżącą lokalizację roboczą. Istnieją dwa rodzaje stosów lokalizacji: domyślny stos lokalizacji roboczej i zero lub więcej zdefiniowanych przez użytkownika nazwanych stosów lokalizacji roboczej. Po rozpoczęciem sesji domyślny stos lokalizacji roboczej jest również stos bieżącej lokalizacji roboczej. Jednak dowolny nazwany stos lokalizacji roboczej może być bieżącym stosem lokalizacji roboczej.

Następujące polecenia cmdlet dotyczą lokalizacji:

  • Set-Location: określa bieżącą lokalizację roboczą
  • Get-Location: określa bieżącą lokalizację roboczą dla określonych dysków lub lokalizacje robocze dla określonych stosów
  • Push-Location: zapisuje bieżącą lokalizację roboczą w górnej części określonego stosu lokalizacji
  • Lokalizacja podręczna: przywraca bieżącą lokalizację roboczą z góry określonego stosu lokalizacji

Typy obiektów, które reprezentują lokalizację roboczą i stos lokalizacji roboczych, są opisane w .4.5.5.

3.3 Elementy

Element jest aliasem (";3.1.1), zmienną (";3.1.5), funkcją (";3.1.4), zmienną środowiskową (";3.1.2) lub plikiem lub katalogiem w systemie plików (";3.1.3).

Następujące polecenia cmdlet zajmują się elementami:

  • Nowy element: tworzy nowy element
  • Set-Item: zmienia wartość jednego lub większej liczby elementów
  • Get-Item: pobiera elementy w określonej lokalizacji
  • Get-ChildItem: pobiera elementy i elementy podrzędne w określonej lokalizacji
  • Copy-Item: kopiuje co najmniej jeden element z jednej lokalizacji do innej
  • Move-Item: przenosi jeden lub więcej elementów z jednej lokalizacji do innej
  • Zmień nazwę elementu: zmienia nazwę elementu
  • Invoke-Item: wykonuje akcję domyślną dla co najmniej jednego elementu
  • Wyczyść element: usuwa zawartość co najmniej jednego elementu, ale nie usuwa elementów (zobacz
  • Remove-Item: usuwa określone elementy

Następujące polecenia cmdlet zajmują się zawartością elementów:

Typ obiektu reprezentującego katalog jest opisany w katalogu .4.5.17. Typ obiektu reprezentującego plik jest opisany w pliku .4.5.18.

3.4 Nazwy ścieżek

Wszystkie elementy w magazynie danych dostępne za pośrednictwem dostawcy programu PowerShell można jednoznacznie zidentyfikować za pomocą ich nazw ścieżek. Nazwa ścieżki jest kombinacją nazwy elementu, kontenera i kontenerów, w których znajduje się element, oraz dysku programu PowerShell, za pomocą którego uzyskuje się dostęp do kontenerów.

Nazwy ścieżek są podzielone na jeden z dwóch typów: w pełni kwalifikowany i względny. W pełni kwalifikowana nazwa ścieżki składa się ze wszystkich elementów, które składają się na ścieżkę. Następująca składnia przedstawia elementy w pełni kwalifikowanej nazwie ścieżki:

Porada

Notacja ~opt~ w definicjach składni wskazuje, że jednostka leksyktyczna jest opcjonalna w składni.

path:
    provider~opt~   drive~opt~   containers~opt~   item

provider:
    module~opt~   provider   ::

module:
    module-name   \

drive:
    drive-name   :

containers:
    container   \
    containers container   \

Nazwa modułu odnosi się do modułu nadrzędnego.

Dostawca odwołuje się do dostawcy programu PowerShell, za pomocą którego uzyskuje się dostęp do magazynu danych.

Dysk odnosi się do dysku programu PowerShell, który jest obsługiwany przez określonego dostawcę programu PowerShell.

Kontener może zawierać inne kontenery, które mogą zawierać inne kontenery i tak dalej, z ostatnim kontenerem, w którym znajduje się element. Kontenery muszą być określone w kolejności hierarchicznej, w której istnieją w magazynie danych.

Oto przykład nazwy ścieżki:

E:\Accounting\InvoiceSystem\Production\MasterAccount\MasterFile.dat

Jeśli ostatni element w ścieżce zawiera inne elementy, jest to element kontenera; W przeciwnym razie jest to element liścia.

W niektórych przypadkach w pełni kwalifikowana nazwa ścieżki nie jest potrzebna. Wystarczy nazwa ścieżki względnej. Nazwa ścieżki względnej jest oparta na bieżącej lokalizacji roboczej. Program PowerShell umożliwia identyfikowanie elementu na podstawie jego lokalizacji względem bieżącej lokalizacji roboczej. Nazwa ścieżki względnej obejmuje użycie niektórych znaków specjalnych. W poniższej tabeli opisano każdy z tych znaków i przedstawiono przykłady nazw ścieżek względnych oraz w pełni kwalifikowanych nazw ścieżek. Przykłady w tabeli są oparte na bieżącym katalogu pracy ustawionym na C:\Windows:

Symbol Opis Ścieżka względna W pełni kwalifikowana ścieżka
. Bieżąca lokalizacja robocza .\System C:\Windows\System
.. Element nadrzędny bieżącej lokalizacji roboczej ..\Program Files C:\Program Files
\ Katalog główny dysku bieżącej lokalizacji roboczej \Program Files C:\Program Files
brak Brak znaków specjalnych System C:\Windows\System

Aby użyć nazwy ścieżki w poleceniu, wprowadź nazwę jako w pełni kwalifikowaną lub względną nazwę ścieżki.

Następujące polecenia cmdlet dotyczą ścieżek:

  • Convert-Path: konwertuje ścieżkę ze ścieżki programu PowerShell na ścieżkę dostawcy programu PowerShell
  • Join-Path: łączy ścieżkę i ścieżkę podrzędną w jedną ścieżkę
  • Resolve-Path: rozwiązuje symbole wieloznaczne w ścieżce
  • Podziel ścieżkę: zwraca określoną część ścieżki
  • Ścieżka testowa: określa, czy istnieją elementy ścieżki, czy ścieżka jest dobrze uformowana

Niektóre polecenia cmdlet (takie jak Add-Content i filtry Copy-Item plików). Filtr plików to mechanizm określania kryteriów wybierania z zestawu ścieżek.

Typ obiektu, który reprezentuje rozpoznaną ścieżkę jest opisany w .4.5.5. Ścieżki są często manipulowane jako ciągi.

3.5 Zakresy

3.5.1 Wprowadzenie

Nazwa może oznaczać zmienną, funkcję, alias, zmienną środowiskową lub dysk. Ta sama nazwa może oznaczać różne elementy w różnych miejscach w skrypcie. Dla każdego innego elementu, który wskazuje nazwa, ta nazwa jest widoczna tylko w obrębie regionu tekstu skryptu nazywanego jego zakresem. Różne elementy oznaczone przez tę samą nazwę mają różne zakresy lub znajdują się w różnych przestrzeniach nazw.

Zakresy mogą zagnieżdżać, w takim przypadku zakres zewnętrzny jest określany jako zakres nadrzędny , a wszelkie zagnieżdżone zakresy są zakresami podrzędnym tego elementu nadrzędnego. Zakresem nazwy jest zakres, w którym jest zdefiniowana, oraz wszystkie zakresy podrzędne, chyba że zostanie ona prywatna. W zakresie podrzędnym zdefiniowana nazwa ukrywa wszystkie elementy zdefiniowane o tej samej nazwie w zakresach nadrzędnych.

O ile nie jest używana notacja źródła kropki ();3.5.5), każda z poniższych czynności tworzy nowy zakres:

  • Plik skryptu
  • Blok skryptu
  • Funkcja lub filtr

Rozpatrzmy następujący przykład:

# start of script
$x = 2; $y = 3
Get-Power $x $y

#function defined in script

function Get-Power([int]$x, [int]$y)
{
if ($y -gt 0) { return $x * (Get-Power $x (--$y)) }

else { return 1 }
}
# end of script

Zakres zmiennych utworzonych w $x $y skrypcie to treść tego skryptu, w tym zdefiniowana w nim funkcja. Funkcja Get-Power definiuje dwa parametry o tych samych nazwach. Ponieważ każda funkcja ma własny zakres, te zmienne różnią się od tych zdefiniowanych w zakresie nadrzędnym i ukrywają je przed zakresem nadrzędnym. Zakres funkcji jest zagnieżdżony wewnątrz zakresu skryptu.

Pamiętaj, że funkcja wywołuje się rekursywnie. Za każdym razem tworzy kolejny zagnieżdżony zakres, każdy z własnymi zmiennymi $x i $y.

Oto bardziej złożony przykład, który pokazuje również zagnieżdżone zakresy i ponowne użycie nazw:

# start of script scope
$x = 2              # top-level script-scope $x created
                    # $x is 2
F1                  # create nested scope with call to function F1
                    # $x is 2
F3                  # create nested scope with call to function F3
                    # $x is 2

function F1 {       # start of function scope
                    # $x is 2
    $x = $true      # function-scope $x created
                    # $x is $true

    & {             # create nested scope with script block
                    # $x is $true
        $x = 12.345 # scriptblock-scope $x created
                    # $x is 12.345
    }               # end of scriptblock scope, local $x goes away

                    # $x is $true
    F2              # create nested scope with call to function F2
                    # $x is $true
}                   # end of function scope, local $x goes away

function F2 {       # start of function scope
                    # $x is $true
    $x = "red"      # function-scope $x created
                    # $x is "red"
}                   # end of function scope, local $x goes away

function F3 {       # start of function scope
                    # $x is 2
    if ($x -gt 0) {
                    # $x is 2
        $x = "green"
                    # $x is "green"
    }               # end of block, but not end of any scope
                    # $x is still "green"
}                   # end of function scope, local $x goes away
# end of script scope

3.5.2 Nazwy i liczby zakresów

Program PowerShell obsługuje następujące zakresy:

  • Globalny: jest to zakres najwyższego poziomu. Wszystkie zmienne automatyczne i zmienne preferencji są zdefiniowane w tym zakresie. Zakres globalny jest zakresem nadrzędnym wszystkich innych zakresów, a wszystkie pozostałe zakresy są zakresami podrzędnym zakresu globalnego.

  • Lokalnie: jest to bieżący zakres w dowolnym punkcie wykonywania skryptu, bloku skryptu lub funkcji. Dowolny zakres może być zakresem lokalnym.

  • Skrypt: ten zakres istnieje dla każdego wykonywanego pliku skryptu. Zakres skryptu jest zakresem nadrzędnym wszystkich zakresów utworzonych na jego podstawie. Blok skryptu nie ma własnego zakresu skryptu; Zamiast tego jego zakresem skryptu jest jego najbliższy nadrzędny plik skryptu. Chociaż nie ma czegoś takiego jak zakres modułu, zakres skryptu zapewnia równoważne.

Nazwy mogą być deklarowane jako prywatne, w takim przypadku nie są widoczne poza zakresem nadrzędnym, nawet w zakresach podrzędnych. Koncepcja prywatna nie jest oddzielnym zakresem; Jest to alias zakresu lokalnego z dodatkiem ukrywania nazwy, jeśli jest używana jako lokalizacja zapisywalna.

Zakresy mogą być określane przez liczbę, która opisuje względne położenie jednego zakresu do innego. Zakres 0 oznacza zakres lokalny, zakres 1 oznacza zakres nadrzędny 1. generacji, zakres 2 oznacza zakres nadrzędny 2. generacji i tak dalej. (Numery zakresu są używane przez polecenia cmdlet do manipulowania zmiennymi).

3.5.3 Zakres nazw zmiennych

Jak pokazano w poniższym środowisku produkcyjnym, można określić nazwę zmiennej z dowolnym z sześciu różnych zakresów:

variable-scope:
    global:
    local:
    private:
    script:
    using:
    workflow:
    variable-namespace

Zakres jest opcjonalny. W poniższej tabeli przedstawiono znaczenie każdej z nich we wszystkich możliwych kontekstach. Pokazuje również zakres, gdy żaden zakres nie jest jawnie określony:

Modyfikator zakresu W pliku skryptu W bloku skryptu W ramach funkcji
global Zakres globalny Zakres globalny Zakres globalny
skrypt Zakres najbliższego nadrzędnego pliku skryptu lub globalny, jeśli nie ma najbliższego pliku skryptu nadrzędnego Zakres najbliższego nadrzędnego pliku skryptu lub globalny, jeśli nie ma najbliższego pliku skryptu nadrzędnego Zakres najbliższego nadrzędnego pliku skryptu lub globalny, jeśli nie ma najbliższego pliku skryptu nadrzędnego
private Zakres globalny/skrypt/lokalny Zakres lokalny Zakres lokalny
local Zakres globalny/skrypt/lokalny Zakres lokalny Zakres lokalny
using Zdefiniowana implementacja Zdefiniowana implementacja Zdefiniowana implementacja
przepływ pracy Zdefiniowana implementacja Zdefiniowana implementacja Zdefiniowana implementacja
brak Zakres globalny/skrypt/lokalny Zakres lokalny Zakres lokalny

Informacje o zakresie zmiennych można również określić w przypadku używania rodziny polecenia cmdlet wymienionych w programie (";3.1.5). W szczególności zapoznaj się z parametrem Scope, parametrami Option Private i , aby uzyskać Option AllScope więcej informacji.

Zakres jest using używany do uzyskiwania dostępu do zmiennych zdefiniowanych w innym zakresie podczas uruchamiania skryptów za pomocą polecenia cmdlet Start-Job, takich jak , Invoke-Commandlub w ramach instrukcji inlinescript-statement. Przykład:

$a = 42
Invoke-Command --ComputerName RemoteServer { $using:a } # returns 42
workflow foo
{
    $b = "Hello"
    inlinescript { $using:b }
}
foo # returns "Hello"

Przepływ pracy zakresu jest używany z instrukcje parallel-statement lub sequence-statement w celu uzyskania dostępu do zmiennej zdefiniowanej w przepływie pracy.

3.5.4 Zakres nazw funkcji

Nazwa funkcji może również mieć jeden z czterech różnych zakresów, a widoczność tej nazwy jest taka sama jak w przypadku zmiennych (";3.5.3).

3.5.5 Notacja źródła kropki

Gdy plik skryptu, blok skryptu lub funkcja są wykonywane z innego pliku skryptu, bloku skryptu lub funkcji, plik wykonanego skryptu tworzy nowy zagnieżdżony zakres. Na przykład

Script1.ps1
& "Script1.ps1"
& { ... }
FunctionA

Jednak gdy jest używana notacja źródła kropki, żaden nowy zakres nie jest tworzony przed wykonaniem polecenia, więc zamiast tego do bieżącego zakresu zostaną wprowadzone dodatki/zmiany wprowadzone we własnym zakresie lokalnym. Na przykład

. Script2.ps1
. "Script2.ps1"
. { ... }
. FunctionA

Moduły w 3.5.6

Podobnie jak plik skryptu najwyższego poziomu znajduje się w katalogu głównym hierarchicznego zagnieżdżone drzewo zakresów, tak samo jest każdy moduł (";3.14). Jednak domyślnie tylko nazwy wyeksportowane przez moduł są dostępne według nazwy w kontekście importowania. Parametr Globalny polecenia cmdlet Import-Module umożliwia zwiększenie widoczności wyeksportowanych nazw.

3.6 Właściwości tylko do odczytu i stałe

Zmienne i aliasy są opisane przez obiekty, które zawierają wiele właściwości. Właściwości te są ustawiane i manipulowane przez dwie rodziny polecenia cmdlet (";3.1.5, .3.1.1). Jedną z takich właściwości są opcje, które można ustawić na wartość ReadOnly lub Constant (przy użyciu parametru Option). Zmienną lub alias oznaczony jako ReadOnly można usunąć, a jej właściwości można zmienić, jeśli określono parametr Force. Jednak zmiennej lub aliasu oznaczonego jako Stała nie można usunąć ani nie można zmienić jej właściwości.

3.7 Metody przeciąża i wywołują rozwiązanie

3.7.1 Wprowadzenie

Jak określono w .1, zewnętrzna procedura dostępna przez środowisko wykonawcze (i napisana w języku innym niż PowerShell) jest nazywana metodą.

Nazwa metody wraz z liczbą i typami jej parametrów jest zbiorczo nazywana podpisem tej metody. (Pamiętaj, że podpis nie zawiera zwracanych typów metody). Środowisko wykonawcze może zezwalać typowi na wiele metod o tej samej nazwie, o ile każda z nich ma inny podpis. Gdy zdefiniowano wiele wersji niektórych metod, ta metoda jest określana jako przeciążona. Na przykład typ Math (zestawie 4.3.8) Abszawiera zestaw metod o nazwie , który oblicza wartość bezwzględną określonej liczby, gdzie określona liczba może mieć jeden z wielu typów. Metody w tym zestawie mają następujące sygnatury:

Abs(decimal)
Abs(float)
Abs(double)
Abs(int)
Abs(long)
Abs(SByte)
Abs(Int16)

W tym przypadku wszystkie metody mają taką samą liczbę argumentów; Ich podpisy różnią się tylko typem argumentu.

Inny przykład obejmuje typ Tablica (zestawie 4.3.2), który zawiera zestaw metod o nazwie Copy, który kopiuje zakres elementów z jednej tablicy do innej, począwszy od początku każdej tablicy (domyślnie) lub w pewnym wyznaczonym elemencie. Metody w tym zestawie mają następujące sygnatury:

Copy(Array, Array, int)
Copy(Array, Array, long)
Copy(Array, int, Array, int, int)
Copy(Array, long, Array, long, long)

W tym przypadku podpisy różnią się również typem argumentu i, w niektórych przypadkach, liczbą argumentów.

W większości wywołań metod przeciążonych liczba i typ przekazanych argumentów dokładnie pasują do jednego z przeciążeń, a wybrana metoda jest oczywista. Jeśli jednak tak nie jest, musi być sposób na rozwiązanie problemu, która przeciążona wersja ma zostać wywołana, jeśli istnieje. Na przykład

[Math]::Abs([byte]10) # no overload takes type byte
[Array]::Copy($source, 3, $dest, 5L, 4) # both int and long indexes

Inne przykłady obejmują ciąg typu (tj. System.String), który ma wiele przeciążonych metod.

Mimo że program PowerShell ma reguły rozpoznawania wywołań metod, które nie pasują dokładnie do przeciążenia podpisu, sam program PowerShell nie zapewnia sposobu definiowania metod przeciążonych.

Uwaga

Uwaga edytora: w programie PowerShell 5.0 dodano możliwość definiowania klas opartych na skryptach. Te klasy mogą zawierać metody przeciążone.

3.7.2 Rozpoznanie przeciążenia metody

W przypadku wywołania metody ([7.1.3) z listą wyrażeń argumentów i zestawem metod kandydowania (tj. metod, które można wywołać), mechanizm wybierania najlepszej metody jest nazywany rozpoznaniem przeciążenia.

Biorąc pod uwagę zestaw odpowiednich metod kandydowania ();3.7.3), wybierana jest najlepsza metoda w tym zestawie. Jeśli zestaw zawiera tylko jedną metodę, metoda ta jest najlepszą metodą. W przeciwnym razie najlepszą metodą jest metoda, która jest lepsza niż wszystkie inne metody w odniesieniu do danej listy argumentów przy użyciu reguł pokazanych w .3.7.4. Jeśli nie ma dokładnie jednej metody, która jest lepsza niż wszystkie inne metody, jej wywołania są niejednoznaczne i zgłaszany jest błąd.

Najlepsza metoda musi być dostępna w kontekście, w którym jest wywoływana. Na przykład skrypt programu PowerShell nie może wywołać metody, która jest prywatna lub chroniona.

Najlepszą metodą wywołania metody statycznej musi być metoda statyczna, a najlepsza metoda wywołania metody wystąpienia musi być metodą wystąpienia.

3.7.3 Metoda stosowana

Metoda jest stosowana w odniesieniu do listy argumentów A, gdy jedna z następujących wartości jest prawdziwa:

  • Liczba argumentów w A jest taka sama jak liczba parametrów akceptowanych przez metodę.
  • Metoda ma wymagane parametry M i N parametrów opcjonalnych, a liczba argumentów w A jest większa lub równa M, ale mniejsza niż N.
  • Metoda akceptuje zmienną liczbę argumentów, a liczba argumentów w A jest większa niż liczba parametrów akceptowanych przez metodę.

Oprócz posiadania odpowiedniej liczby argumentów, każdy argument w A musi odpowiadać trybowi przekazywania parametrów argumentu, a typ argumentu musi odpowiadać typowi parametru lub musi być konwersja z typu argumentu na typ parametru.

Jeśli typ argumentu to ref ([4.3.6], odpowiednim parametrem musi być również ref, a dla celów konwersji typem argumentu jest typ właściwości Value z argumentu ref.

Jeśli typ argumentu to ref, odpowiednim parametrem może być out zamiast ref.

Jeśli metoda akceptuje zmienną liczbę argumentów, metoda może być stosowana w postaci normalnej lub rozszerzonej. Jeśli liczba argumentów w A jest taka sama jak liczba parametrów akceptowanych przez metodę, a ostatni parametr jest tablicą, formularz zależy od rangi jednej z dwóch możliwych konwersji:

  • Ranga konwersji z typu ostatniego argumentu w A na typ tablicy dla ostatniego parametru.
  • Ranga konwersji z typu ostatniego argumentu w A na typ elementu typu tablicy dla ostatniego parametru.

Jeśli pierwsza konwersja (na typ tablicy) jest lepsza niż druga konwersja (na typ elementu tablicy), metoda ma zastosowanie w postaci normalnej. W przeciwnym razie ma zastosowanie w postaci rozszerzonej.

Jeśli argumentów jest więcej niż parametrów, metoda może być stosowana tylko w postaci rozwiniętej. Aby można było go użyć w postaci rozwiniętej, ostatni parametr musi mieć typ tablicy. Metoda jest zastępowana równoważną metodą, która ma ostatni parametr zastąpiony parametrem wystarczającym do uwzględnienia każdego niedopasowanych argumentów w A. Każdy dodatkowy typ parametru jest typem elementu typu tablicy dla ostatniego parametru w oryginalnej metodzie. Powyższe reguły dla odpowiednich metod są stosowane do tej nowej metody i listy argumentów A.

3.7.4 Better, metoda

Mając listę argumentów A z zestawem wyrażeń argumentów { E~1~, E~2~, ..., E~N~ } M~P~ { Q~1~, Q~2~, ..., Q~N~ }``{ P~1~, P~2~, ..., P~N~ } M~Q~ i dwiema metodami aplikacji oraz z typami parametrów i , M~P~ M~Q~ M~P~ M~Q~jest zdefiniowana jako lepsza metoda niż w przypadku, gdy skumulowana klasyfikacja konwersji jest lepsza niż dla .

Skumulowana klasyfikacja konwersji jest obliczana w następujący sposób. Każda konwersja jest warta innej wartości w zależności od liczby parametrów, E~1~ z konwersją wartości N o E~2~ wartości N-1 w E~N~ dół do wartości 1. Jeśli konwersja z E~X~ na jest P~X~ lepsza Q~X~``E~X~ niż konwersja z na , M~P~ akumuluje N-X+1; M~Q~ w przeciwnym razie kumuluje N-X+1. Jeśli M~P~ wartości i M~Q~ mają taką samą wartość, używane są następujące reguły podziału powiązać, stosowane w kolejności:

  • Skumulowana klasyfikacja konwersji między typami parametrów (ignorując typy argumentów) jest obliczana w sposób podobny do poprzedniej klasyfikacji, P~1~ więc jest porównywana z , Q~2~``P~2~ względem , ... i P~N~ względem Q~N~.Q~1~ Porównanie jest pomijane, jeśli argument to $null, lub jeśli typy parametrów nie są typami liczb. Porównanie jest również pomijane, jeśli konwersja argumentu E~X~ P~X~ utraci informacje podczas konwersji na , ale nie utraci informacji Q~X~podczas konwersji na wartość lub odwrotnie. Jeśli typy konwersji parametrów są porównywane, P~X~ Q~X~ P~X~``Q~X~ to jeśli konwersja z na jest lepsza niż konwersja z na , M~P~ akumuluje N-X+1; M~Q~ w przeciwnym razie gromadzi N-X+1. Ta reguła łamania powiązać ma preferować najbardziej konkretną metodę (tj . metodę z parametrami o najmniejszych typach danych), jeśli podczas konwersji nie zostaną utracone żadne informacje, lub preferowanie najbardziej ogólnej metody (tj . metody z parametrami z największymi typami danych), jeśli konwersje spowodują utratę informacji.
  • Jeśli obie metody używają rozwiniętego formularza, lepszym rozwiązaniem jest metoda z większą liczby parametrów.
  • Jeśli jedna metoda używa formularza rozwiniętego, a druga używa formularza normalnego, metoda używająca normalnego formularza jest lepszą metodą.

3.7.5 Lepsza konwersja

Poniższy tekst oznaczony jako ten jest specyficzny dla Windows PowerShell.

Konwersje są klasyfikowane w następujący sposób, od najniższego do najwyższego:

  • T~1~[] gdzie T~2~[] nie można przypisać konwersji między T~1~ i T~2~ istnieje
  • T na ciąg, gdzie T jest dowolnym typem
  • T~1~do T~2~ miejsca lub T~2~ T~1~ zdefiniowania konwersji niestandardowej w sposób zdefiniowany w implementacji
  • T~1~ do T~2~ where T~1~ implements IConvertible
  • T~1~ do T~2~ gdzie T~1~ lub T~2~ implementuje metodę T~2~ op_Implicit(T1)
  • T~1~ do T~2~ gdzie T~1~ lub T~2~ implementuje metodę T~2~ op_Explicit(T1)
  • T~1~ do T~2~ where T~2~ implementuje konstruktora, który przyjmuje pojedynczy argument typu T~1~
  • Jedną z następujących konwersji:
    • ciąg , T gdzie T implementuje metodę statyczną T Parse(string) lub T Parse(string, IFormatProvider)
    • T~1~ do T~2~ gdzie T~2~ jest dowolnym wyliczeniu i T~1~ jest ciągiem lub kolekcją obiektów, które można przekonwertować na ciąg
  • T do PSObject, gdzie T jest dowolnym typem
  • Dowolna z następujących konwersji: Language
    • T do bool, gdzie T jest dowolnym typem liczbowym
    • ciąg gdzie to T regex``T , wmisearcher, wmi, wmiclass, adsi, adsisearcher, , lubtype
    • T do bool
    • T~1~ do miejsca Nullable[T~2~] , w którym istnieje konwersja T~1~ z T~2~ na
    • T do void
    • T~1~[], gdzie T~2~[] istnieje przypisana konwersja między elementami T~1~ i T~2~
    • T~1~ do T~2~[] gdzie T~1~ jest kolekcją
    • IDictionary do Hashtable
    • T do ref
    • T do xml
    • scriptblock do delegate
    • T~1~ do T~2~ gdzie T~1~ jest typem liczby całkowitej i T~2~ jest wyliczbem
  • $null do T gdzie T jest dowolnym typem wartości
  • $null do T gdzie T jest dowolnym typem odwołania
  • Dowolna z następujących konwersji:
    • bajt do gdzie T T to SByte

    • UInt16 do T where T is SByte, byte, or Int16

    • Int16do T gdzie to SByte T lubbyte

    • UInt32 do T where T is SByte, byte, Int16, UInt16, or int

    • int do T where T is SByte, byte, Int16, or UInt16

    • UInt64 do T where T is SByte, byte, Int16, UInt16, int, UInt32, , or long

    • long do T where T is SByte, byte, Int16, UInt16, int, , or UInt32

    • float do T gdzie jest T dowolnym typem liczby całkowitej lub decimal

    • double do T gdzie jest T dowolnym typem liczby całkowitej lub decimal

    • decimal do T gdzie jest T dowolnym typem liczby całkowitej

  • Dowolna z następujących konwersji:
    • SByte do T where T is byte, uint6, UInt32, or UInt64
    • Int16 do T where T is UInt16, UInt32, or UInt64
    • intdo T gdzie to UInt32 T lubUInt64
    • long do UInt64
    • decimaldo T gdzie to float T lubdouble
  • Dowolna z następujących konwersji:
    • T do string gdzie jest T dowolnym typem liczbowym
    • T do char gdzie jest T dowolnym typem liczbowym
    • string do T gdzie jest T dowolnym typem liczbowym
  • Każda z następujących konwersji jest uznawana za konwersję, która może zostać przypisana:
    • byte do T where T is Int16, UInt16, int, UInt32, long, UInt64, single, double, , or decimal
    • SByte do T where T is Int16, UInt16, int, UInt32, long, UInt64, single, double, , or decimal
    • UInt16 gdzie T to T int, UInt32, , longlub UInt64, single, double, lub decimal
    • Int16 gdzie T to T int, UInt32, , longlub UInt64, single, double, lub decimal
    • UInt32 gdzie T to T long, lub UInt64, single, double, lub decimal
    • int do T where T is long, UInt64, single, double, or decimal
    • single do double
  • T~1~ do T~2~ where T~2~ is a base class or interface of T~1~. Ta konwersja jest uważana za konwersję, która może zostać przypisana.
  • string do char[]
  • T do T — ta konwersja jest uważana za konwersję, która może zostać przypisana.

Dla każdej konwersji formularza do typu , gdzie nie jest tablicą i nie ma żadnego innego przypadku konwersji, T~2~``T~1~ jeśli istnieje konwersja z na , T~2~``T~1~ ranga konwersji jest gorsza niż konwersja z na , ale T~1~ lepsza niż każda konwersja sklasyfikowana w sposób mniejszy niż konwersja z na T~1~ T~2~[] T~1~``T~2~

3.8 Odnośnik do nazw

Polecenia różnego rodzaju mogą mieć taką samą nazwę. Kolejność wyszukiwania nazw w takim przypadku to alias, funkcja, polecenie cmdlet i polecenie zewnętrzne.

3.9. Odnośnik do nazwy typu

[Plik ]7.1.10]§7.1.10 zawiera instrukcje " Literał typu jest reprezentowany w implementacji przez pewien nieokreślony typ bazowy. W związku z tym nazwa typu jest synonimem jego typu bazowego". Przykładowe typy to int, double, long[]i Hashtable.

Nazwy typów są do siebie dopasowane w następujący sposób: porównaj nazwę danego typu z listą wbudowanych akceleratorów typów, takich jak int, long, double. Jeśli zostanie znalezione dopasowanie, jest to typ . W przeciwnym razie przyjmij, że nazwa typu jest w pełni kwalifikowana i sprawdź, czy taki typ istnieje w systemie hosta. Jeśli zostanie znalezione dopasowanie, jest to typ . W przeciwnym razie dodaj prefiks przestrzeni nazw System.. Jeśli zostanie znalezione dopasowanie, jest to typ . W przeciwnym razie nazwa typu jest błędna. Ten algorytm jest stosowany dla każdego argumentu typu dla typów ogólnych. Nie ma jednak potrzeby określania arity (liczby argumentów lub argumentów zajętej przez funkcję lub operator).

3.10 Automatyczne zarządzanie pamięcią

Różne operatory i polecenia cmdlet mogą powodować alokację pamięci dla obiektów typu odwołania, takich jak ciągi i tablice. Alokacja i wolne użycie tej pamięci jest zarządzane przez system środowiska uruchomieniowego programu PowerShell. Oznacza to, że program PowerShell zapewnia automatyczne odzyskiwanie pamięci.

3.11 Kolejność wykonywania

Efektem ubocznym jest zmiana stanu środowiska wykonywania polecenia. Zmiana wartości zmiennej (za pośrednictwem operatorów przypisania lub operatorów przed i po inkrementacjach i dekrementacjach) jest efektem ubocznym, podobnie jak zmiana zawartości pliku.

O ile nie określono inaczej, instrukcje są wykonywane w kolejności leksykatycznej.

Z wyjątkiem sytuacji określonych dla niektórych operatorów, kolejność oceny terminów w wyrażeniu i kolejność, w jakiej mają miejsce skutki uboczne, są nieokreślone.

Wyrażenie, które wywołuje polecenie, obejmuje wyrażenie, które wyznacza polecenie, i zero lub więcej wyrażeń, które wyznaczają argumenty, których wartości mają być przekazane do tego polecenia. Kolejność, w jakiej te wyrażenia są obliczane względem siebie, jest nieokreślona.

3.12 Obsługa błędów

Jeśli polecenie zakończy się niepowodzeniem, jest to uznawane za błąd, a informacje o tym błędzie są rejestrowane w rekordzie błędu , którego typ jest nieokreślony (";4.5.15); Jednak ten typ obsługuje indeks dolny.

Błąd należy do jednej z dwóch kategorii. Kończy operację (błąd kończący) lub nie (błąd niepowiązywający zakończenia). W przypadku błędu zakończenia ten błąd jest rejestrowany i operacja kończy się. W przypadku błędu bez zakończenia błąd jest rejestrowany i operacja jest kontynuowana.

Błędy niepowiązyujące się z błędami są zapisywane w strumieniu błędów. Mimo że te informacje można przekierować do pliku, obiekty błędów są najpierw konwertowane na ciągi i ważne informacje w tych obiektach nie zostaną przechwycone, co utrudnia diagnostykę, jeśli nie jest to niemożliwe. Zamiast tego można przekierować tekst błędu ([7.12) i zapisać obiekt błędu w zmiennej, jak w pliku $Error1 = command 2>&1.

Zmienna automatyczna $Error zawiera kolekcję rekordów błędów, które reprezentują ostatnie błędy, a najnowszy błąd to $Error[0]. Ta kolekcja jest utrzymywana w buforze tak, aby stare rekordy zostały odrzucone w przypadku dodania nowych. Zmienna automatyczna $MaximumErrorCount kontroluje liczbę rekordów, które mogą być przechowywane.

$Error Zawiera wszystkie błędy ze wszystkich poleceń w jednej kolekcji. Aby zebrać błędy z określonego polecenia, użyj wspólnego parametru ErrorVariable, który umożliwia ustawienie zmiennej zdefiniowanej przez użytkownika w celu przechowywania kolekcji.

3.13 Pipelines

Potok to seria poleceń rozdzielonych operatorem potoku | (U+007C). Każde polecenie odbiera dane wejściowe od swojego poprzednika i zapisuje dane wyjściowe jego następcy. O ile dane wyjściowe na końcu potoku nie zostaną odrzucone lub przekierowane do pliku, są wysyłane do środowiska hosta, które może zapisywać je w standardowych danych wyjściowych. Polecenia w potoku mogą również odbierać dane wejściowe z argumentów. Rozważmy Get-ChildItemna przykład następujące użycie poleceń , Sort-Objecti Process-File, które tworzą listę nazw plików w danym katalogu systemu plików, sortuje zestaw rekordów tekstowych i wykonują pewne przetwarzanie odpowiednio na rekordzie tekstowym:

Get-ChildItem
Get-ChildItem e:*.txt | Sort-Object -CaseSensitive | Process-File >results.txt

W pierwszym przypadku program Get-ChildItem tworzy kolekcję nazw plików w katalogu bieżącym/domyślnym. Ta kolekcja jest wysyłana do środowiska hosta, które domyślnie zapisuje wartość każdego elementu w standardowych danych wyjściowych.

W drugim przypadku program Get-ChildItem tworzy kolekcję nazw plików w określonym katalogu przy użyciu argumentu e:*.txt. Ta kolekcja jest zapisywana Sort-Objectw poleceniu , które domyślnie sortuje je w kolejności rosnącej, z uwzględnianiem wielkości liter (na podstawie argumentu Bez uwzględniania wielkości liter). Wynikowa kolekcja jest następnie zapisywana w poleceniu Process-File, które wykonuje pewne (nieznane) przetwarzanie. Dane wyjściowe tego polecenia są następnie przekierowywany do pliku results.txt.

Jeśli polecenie zapisuje pojedynczy obiekt, jego następca otrzymuje ten obiekt, a następnie kończy działanie po zapisie własnych obiektów na jego następcę. Jeśli jednak polecenie zapisuje wiele obiektów, są one dostarczane po jednym naraz do następcy polecenia, które jest wykonywane raz dla każdego obiektu. To zachowanie jest nazywane przesyłaniem strumieniowym. Podczas przetwarzania strumieniowego obiekty są zapisywane w potoku natychmiast po ich staną się dostępne, a nie po produkcji całej kolekcji.

Podczas przetwarzania kolekcji polecenie może być napisane w taki sposób, aby można było wykonać specjalne przetwarzanie przed początkowym elementem i po elemencie końcowym.

3.14 Moduły

Moduł to samodzielna jednostka wielokrotnego użytku, która umożliwia partycjonowanie, zorganizowanie i abstraktowanie kodu programu PowerShell. Moduł może zawierać polecenia (takie jak polecenia cmdlet i funkcje) oraz elementy (takie jak zmienne i aliasy), które mogą być używane jako pojedyncza jednostka.

Po utworzeniu modułu należy go zaimportować do sesji, aby można było użyć jego poleceń i elementów. Po zaimportowaniu polecenia i elementy zachowują się tak, jakby zostały zdefiniowane lokalnie. Moduł jest importowany jawnie za pomocą Import-Module polecenia . Moduł może być również importowany automatycznie zgodnie z definicją w sposób zdefiniowany w implementacji.

Typ obiektu reprezentującego moduł jest opisany w module .4.5.12.

Moduły zostały szczegółowo omówione w artykule .11.

3.15 Wyrażenia z symbolami wieloznacznymi

Wyrażenie wieloznaczne może zawierać zero lub więcej z następujących elementów:

Element Opis
Znak inny niż *, ?, lub [ Dopasowuje ten jeden znak
* Dopasowuje zero lub więcej znaków. Aby dopasować znak *, użyj znaku [*].
? Dopasowuje dowolny jeden znak. Aby dopasować ? znak, użyj [?].
[zestaw]

Dopasowuje dowolny znak z zestawu, który nie może być pusty.

Jeśli wartość set rozpoczyna się od ], prawy nawias kwadratowy jest traktowany jako część zestawu, a następny prawy nawias kwadratowy kończy zestaw; W przeciwnym razie pierwszy prawy nawias kwadratowy kończy zestaw.

Jeśli wartość set rozpoczyna się lub kończy znakiem -, ten łącznik-minus jest traktowany jako część zestawu; W przeciwnym razie wskazuje zakres kolejnych punktów kodu Unicode ze znakami po obu stronach łącznika minus jako ograniczniki zakresu włącznie. Na przykład A–Z oznacza 26 wielkich liter angielskich, a 0–9 — 10 cyfr dziesiętnych.

Uwaga

Więcej informacji można znaleźć na stronie The Open Group Base Specifications: Pattern Matching", IEEE Std 1003.1, 2004 Edition.. Jednak w programie PowerShell znak ucieczki to ukośnik odwrotny, a nie ukośnik odwrotny.

3.16 Wyrażenia regularne

Wyrażenie regularne może zawierać zero lub więcej z następujących elementów:

Element Opis
Znak inny niż ., [, ^, *, $, lub \ Dopasowuje ten jeden znak
. Dopasowuje dowolny jeden znak. Aby dopasować . użyj znaku \..
[zestaw]
[^set]

Formularz [set] dopasowuje dowolny znak z zestawu. Formularz [^set] nie dopasowuje żadnych znaków z zestawu. Wartość set nie może być pusta.

Jeśli wartość set zaczyna się od ] lub ^], prawy nawias kwadratowy jest traktowany jako część zestawu, a następny prawy nawias kwadratowy kończy zestaw; W przeciwnym razie pierwszy prawy nawias kwadratowy kończy zestaw.

Jeśli wartość set zaczyna się od - lub ^-, lub kończy się znakiem -, ten łącznik-minus jest traktowany jako część zestawu; W przeciwnym razie wskazuje zakres kolejnych punktów kodu Unicode ze znakami po obu stronach łącznika minus jako ograniczniki zakresu włącznie. Na przykład A–Z oznacza 26 wielkich liter angielskich, a 0–9 — 10 cyfr dziesiętnych.

* Dopasowuje zero większej liczby wystąpień poprzedniego elementu.
+ Dopasowuje jedno z kolejnych wystąpień poprzedniego elementu.
? Dopasowuje zero z jednego wystąpienia poprzedniego elementu.
^ Dopasowuje na początku ciągu. Aby dopasować znak ^ , użyj .\^
$ Dopasowuje na końcu ciągu. Aby dopasować znak $, użyj znaku $.
\C Znak ucieczki c, więc nie jest rozpoznawany jako element wyrażenia regularnego.

Windows PowerShell: Klasy znaków dostępne w języku Microsoft .NET Framework są obsługiwane w następujący sposób:

Element Opis
\p{name} Dopasowuje dowolny znak w nazwanej klasie znaków określonej przez nazwę. Obsługiwane nazwy to grupy Unicode i zakresy bloków, takie jak Ll, Nd, Z, IsGreek i IsBoxDrawing.
\P{name} Dopasowuje tekst, który nie jest uwzględniony w grupach i zakresach bloków określonych w nazwie.
\w Dopasowuje dowolny znak słowa. Odpowiednik kategorii znaków Unicode [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]. Jeśli zachowanie zgodne z ECMAScript jest określone za pomocą opcji ECMAScript, \w jest odpowiednikiem [a-zA-Z_0-9].
\W Dopasowuje dowolny znak niebędący znakiem słowa. Odpowiada kategorii Unicode [\^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}].
\s Dopasowuje dowolny znak odstępu. Równoważne kategoriom znaków [\f\n\r\t\v\x85\p{Z}] Unicode.
\S Dopasowuje dowolny znak niebędący znakiem odstępu. Odpowiednik kategorii znaków Unicode [\^\f\n\r\t\v\x85\p{Z}].
\d Dopasowuje dowolną cyfrę dziesiętną. Odpowiednik dla \p{Nd} unicode i [0-9] zachowania innych niż Unicode.
\D Dopasowuje dowolną liczbę niecyfrową. Odpowiednik dla \P{Nd} unicode i [\^0-9] zachowania innych niż Unicode.

Kwantyfikatory dostępne w .NET Framework Microsoft są obsługiwane w następujący sposób:

Element Opis
* Określa zero lub więcej dopasowania; na przykład lub \w* równoważne (abc)*. .{0,}
+ Dopasowuje powtarzające się wystąpienia poprzednich znaków.
? Określa zero lub jeden dopasowania; na przykład lub \w? (abc)?. Odpowiednik .{0,1}
{n} Określa dokładnie n dopasowania; na przykład (pizza){2}.
{n,} Określa co najmniej n dopasowania; na przykład (abc){2,}.
{n,m} Określa co najmniej n, ale nie więcej niż m, dopasowuje.