Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Redakční poznámka
Důležité
specifikace jazyka Windows PowerShell 3.0 byla publikována v prosinci 2012 a je založená na prostředí Windows PowerShell 3.0. Tato specifikace neodráží aktuální stav PowerShellu. Tato dokumentace se neplánuje aktualizovat tak, aby odrážela aktuální stav. Tato dokumentace je zde uvedena pro historické reference.
Dokument specifikace je k dispozici jako dokument aplikace Microsoft Word z webu Microsoft Download Center na adrese: https://www.microsoft.com/download/details.aspx?id=36389 Dokument aplikace Word byl převeden pro prezentaci zde na webu Microsoft Learn. Během převodu byly provedeny některé redakční změny tak, aby vyhovovaly formátování pro platformu Docs. Některé překlepy a menší chyby byly opraveny.
3.1 Poskytovatelé a jednotky
Zprostředkovatel umožňuje přístup k datům a komponentám, které by jinak nebyly snadno přístupné na příkazovém řádku. Data jsou prezentována v konzistentním formátu, který se podobá jednotce systému souborů.
Data, která poskytovatel zveřejňuje, se zobrazují na jednotce a k datům se přistupuje prostřednictvím cesty stejně jako u diskové jednotky. Předdefinované rutiny pro každého zprostředkovatele spravují data na jednotce poskytovatele.
PowerShell obsahuje následující sadu předdefinovaných poskytovatelů pro přístup k různým typům úložišť dat:
| Poskytovatel | Název jednotky | Description | Sudí. |
|---|---|---|---|
| Přezdívka | Alias: | Aliasy PowerShellu | §3.1.1 |
| Životní prostředí | Env: | Proměnné prostředí | §3.1.2 |
| Systém souborů | A:, B:, C:, ... | Diskové jednotky, adresáře a soubory | §3.1.3 |
| Funkce | Funkce: | Funkce PowerShellu | §3.1.4 |
| Proměnná | Proměnná: | Proměnné PowerShellu | §3.1.5 |
Windows PowerShell:
| Poskytovatel | Název jednotky | Description |
|---|---|---|
| Certifikát | Hotovka: | Certifikáty X509 pro digitální podpisy |
| Rejstřík | HKLM: (HKEY_LOCAL_MACHINE), HKCU: (HKEY_CURRENT_USER) | Registr Systému Windows |
| WSMan | WSMan: | WS-Management informace o konfiguraci |
Následující rutiny se zabývají poskytovateli a jednotkami:
- Get-PSProvider: Získá informace o jednom nebo více poskytovateli
- Get-PSDrive: Získá informace o jedné nebo více jednotkách
Typ objektu, který představuje zprostředkovatele, je popsán v §4.5.1. Typ objektu, který představuje jednotku, je popsán v §4.5.2.
3.1.1 Aliasy
Alias je alternativní název příkazu. Příkaz může mít více aliasů a původní název a všechny jeho aliasy se dají zaměnitelně. Alias je možné znovu přiřadit. Alias je položka (§3.3).
Alias lze přiřadit jinému aliasu; nový alias ale není aliasem původního příkazu.
Alias zprostředkovatele je plochý obor názvů, který obsahuje pouze objekty představující aliasy. Proměnné nemají žádné podřízené položky.
PowerShell obsahuje sadu předdefinovaných aliasů.
Následující rutiny se zabývají aliasy:
- Nový alias: Vytvoří alias.
- Nastavit alias: Vytvoří nebo změní jeden nebo více aliasů.
- Získání aliasu: Získá informace o jednom nebo více aliasech.
- Export-Alias: Exportuje jeden nebo více aliasů do souboru.
Při vytvoření aliasu pro příkaz pomocí New-Aliasparametru pro tento příkaz nelze zahrnout do daného aliasu. Přímé přiřazení proměnné v aliasu však umožňuje zahrnout parametry.
Poznámka:
Je to ale jednoduché, vytvořit funkci, která nedělá nic víc, než obsahuje vyvolání tohoto příkazu se všemi požadovanými parametry, a přiřazení aliasu této funkci.
Typ objektu, který představuje alias, je popsán v §4.5.4.
Objekty aliasů jsou uloženy v aliasu jednotky: (§3.1).
3.1.2 Proměnné prostředí
Poskytovatel prostředí PowerShellu umožňuje načtení, přidání, změně, vymazání a odstranění proměnných prostředí operačního systému.
Prostředí zprostředkovatele je plochý obor názvů, který obsahuje pouze objekty, které představují proměnné prostředí. Proměnné nemají žádné podřízené položky.
Název proměnné prostředí nesmí obsahovat znaménko rovná se (=).
Změny proměnných prostředí ovlivňují pouze aktuální relaci.
Proměnná prostředí je položka (§3.3).
Typ objektu, který představuje proměnnou prostředí, je popsán v §4.5.6.
Objekty proměnné prostředí jsou uloženy na jednotce Env: (§3.1).
3.1.3 Systém souborů
Zprostředkovatel systému souborů PowerShellu umožňuje vytváření, otevření, změně a odstranění adresářů a souborů.
Zprostředkovatel FileSystem je hierarchický obor názvů, který obsahuje objekty představující základní systém souborů.
Soubory jsou uloženy na jednotkách s názvy jako A:, B:, C:a tak dále (§3.1). K adresářům a souborům se přistupuje pomocí zápisu cesty (§3.4).
Adresář nebo soubor je položka (§3.3).
3.1.4 Funkce
Zprostředkovatel funkce PowerShellu umožňuje načíst, přidat, změnit, vymazat a odstranit funkce (§8.10.1) a filtry (§8.10.1).
Funkce zprostředkovatele je plochý obor názvů, který obsahuje pouze objekty funkce a filtru. Funkce ani filtry nemají podřízené položky.
Změny funkcí ovlivňují pouze aktuální relaci.
Funkce je položka (§3.3).
Typ objektu, který představuje funkci, je popsán v §4.5.10. Typ objektu, který představuje filtr, je popsán v §4.5.11.
Objekty funkce jsou uloženy na jednotce Funkce: (§3.1).
3.1.5 Proměnné
Proměnné je možné definovat a manipulovat s nimi přímo v jazyce PowerShellu.
Proměnná zprostředkovatele je plochý obor názvů, který obsahuje pouze objekty, které představují proměnné. Proměnné nemají žádné podřízené položky.
Následující rutiny také pracují s proměnnými:
- Nová proměnná: Vytvoří proměnnou.
- Nastavit proměnnou: Vytvoří nebo změní charakteristiky jedné nebo více proměnných.
- Get-Variable: Získá informace o jedné nebo více proměnných.
- Vymazat proměnnou: Odstraní hodnotu jedné nebo více proměnných.
- Remove-Variable: Odstraní jednu nebo více proměnných.
Protože proměnná je položka (§3.3), může s ní pracovat většina rutin souvisejících s položkami.
Typ objektu, který představuje proměnnou, je popsán v §4.5.3.
Proměnné objekty jsou uloženy na proměnné jednotky: (§3.1).
3.2 Pracovní místa
Aktuální pracovní umístění je výchozím umístěním, na které příkazy odkazují. Toto je umístění použité v případě, že při vyvolání příkazu není zadána explicitní cesta (§3.4). Toto umístění zahrnuje aktuální jednotku.
Hostitel PowerShellu může mít více jednotek, v takovém případě má každá jednotka vlastní aktuální umístění.
Pokud je zadán název jednotky bez adresáře, aktuální umístění pro danou jednotku je implicitní.
Aktuální pracovní umístění lze uložit do zásobníku a pak nastavit na nové umístění. Později lze toto uložené umístění obnovit z daného zásobníku a provést aktuální pracovní umístění. Existují dva druhy zásobníků umístění: výchozí zásobník pracovních umístění a nula nebo více uživatelsky definovaných zásobníků pracovních umístění. Při zahájení relace je výchozím zásobníkem pracovních umístění také aktuální zásobník pracovních umístění. Jakýkoli pojmenovaný zásobník pracovních umístění však může být aktuální zásobník pracovních umístění.
Následující rutiny se zabývají umístěními:
- Nastavení umístění: Vytvoří aktuální pracovní umístění.
- Získání umístění: Určuje aktuální pracovní umístění pro zadané jednotky nebo pracovní umístění pro zadané zásobníky.
- Nabízené umístění: Uloží aktuální pracovní umístění v horní části zadaného zásobníku umístění.
- Místní umístění: Obnoví aktuální pracovní umístění z horní části zadaného zásobníku umístění.
Typy objektů, které představují pracovní umístění a zásobník pracovních umístění jsou popsány v §4.5.5.
3.3 Položky
Položka je alias (§3.1.1), proměnná (§3.1.5), funkce (§3.1.4), proměnná prostředí (§3.1.2) nebo soubor nebo adresář v systému souborů (§3.1.3).
Následující rutiny se zabývají položkami:
- Nová položka: Vytvoří novou položku.
- Set-Item: Změní hodnotu jedné nebo více položek.
- Get-Item: Získá položky v zadaném umístění
- Get-ChildItem: Získá položky a podřízené položky v zadaném umístění
- Kopírovat položku: Zkopíruje jednu nebo více položek z jednoho umístění do jiného.
- Přesunout položku: Přesune jednu nebo více položek z jednoho umístění do jiného.
- Přejmenovat položku: Přejmenuje položku.
- Vyvolání položky: Provede výchozí akci u jedné nebo více položek.
- Vymazat položku: Odstraní obsah jedné nebo více položek, ale neodstraní položky (viz
- Remove-Item: Odstraní zadané položky.
Následující rutiny se zabývají obsahem položek:
- Get-Content: Získá obsah položky
- Přidat obsah: Přidá obsah do zadaných položek.
- Set-Content: Zapisuje nebo nahrazuje obsah v položce.
- Vymazat obsah: Odstraní obsah položky.
Typ objektu, který představuje adresář, je popsán v §4.5.17. Typ objektu, který představuje soubor, je popsán v §4.5.18.
3.4 Názvy cest
Všechny položky v úložišti dat přístupné prostřednictvím zprostředkovatele PowerShellu je možné jednoznačně identifikovat názvy cest. Název cesty je kombinace názvu položky, kontejneru a podkontejnerů, ve kterých se položka nachází, a jednotky PowerShellu, přes kterou jsou kontejnery přístupné.
Názvy cest jsou rozdělené na jeden ze dvou typů: plně kvalifikovaný a relativní. Plně kvalifikovaný název cesty se skládá ze všech prvků, které tvoří cestu. Následující syntaxe ukazuje prvky v plně kvalifikovaném názvu cesty:
Tip
Zápis ~opt~ v definicích syntaxe označuje, že lexikální entita je v syntaxi nepovinná.
path:
provider~opt~ drive~opt~ containers~opt~ item
provider:
module~opt~ provider ::
module:
module-name \
drive:
drive-name :
containers:
container \
containers container \
Název modulu odkazuje na nadřazený modul.
poskytovatel odkazuje na zprostředkovatele PowerShellu, prostřednictvím kterého se přistupuje k úložišti dat.
jednotka odkazuje na jednotku PowerShellu podporovanou konkrétním poskytovatelem PowerShellu.
Kontejner může obsahovat další kontejnery, které můžou obsahovat další kontejnery, a tak dále s posledním kontejnerem, který obsahuje položku. Kontejnery musí být zadány v hierarchickém pořadí, ve kterém existují v úložišti dat.
Tady je příklad názvu cesty:
E:\Accounting\InvoiceSystem\Production\MasterAccount\MasterFile.dat
Pokud konečný prvek v cestě obsahuje další prvky, jedná se o element kontejneru; v opačném případě se jedná o prvek typu list.
V některých případech není potřeba plně kvalifikovaný název cesty; bude stačit relativní název cesty. Relativní název cesty je založený na aktuálním pracovním umístění. PowerShell umožňuje identifikaci položky na základě jejího umístění vzhledem k aktuálnímu pracovnímu umístění. Relativní název cesty zahrnuje použití některých speciálních znaků. Následující tabulka popisuje každý z těchto znaků a uvádí příklady relativních názvů cest a plně kvalifikovaných názvů cest. Příklady v tabulce jsou založené na aktuálním pracovním adresáři, který je nastavený na C:\Windows:
| Symbol | Description | Relativní cesta | Plně kvalifikovaná cesta |
|---|---|---|---|
. |
Aktuální pracovní umístění | .\System |
C:\Windows\System |
.. |
Nadřazený prvek aktuálního pracovního umístění | ..\Program Files |
C:\Program Files |
\ |
Kořen jednotky aktuálního pracovního umístění | \Program Files |
C:\Program Files |
| Žádná | Žádné speciální znaky | System |
C:\Windows\System |
Pokud chcete v příkazu použít název cesty, zadejte tento název jako plně kvalifikovaný nebo relativní název cesty.
Následující rutiny se zabývají cestami:
- Convert-Path: Převede cestu z cesty PowerShellu na cestu zprostředkovatele PowerShellu.
- Join-Path: Kombinuje cestu a podřízenou cestu do jedné cesty.
- Resolve-Path: Řeší zástupné znaky v cestě.
- Split-Path: Vrátí zadanou část cesty.
- Testovací cesta: Určuje, zda existují prvky cesty, nebo zda je cesta správně vytvořená.
Některé rutiny (například Add-Content a Copy-Item použití filtrů souborů)
Filtr souborů je mechanismus pro určení kritérií pro výběr ze sady cest.
Typ objektu, který představuje přeloženou cestu, je popsán v §4.5.5. Cesty se často zpracovávají jako řetězce.
3.5 Rozsahy
3.5.1 Úvod
Název může označit proměnnou, funkci, alias, proměnnou prostředí nebo jednotku. Stejný název může v skriptu znamenat různé položky na různých místech. Pro každou jinou položku, která název označuje, je tento název viditelný pouze v oblasti textu skriptu, která se nazývá jeho obor. Různé položky označené stejným názvem mají různé obory nebo jsou v různých názvových prostorech.
Obory můžou vnořit, v takovém případě se vnější obor označuje jako nadřazený obor a všechny vnořené obory jsou podřízenými obory daného nadřazeného objektu. Obor názvu je obor, ve kterém je definován, a všechny podřízené obory, pokud není privátní. V rámci podřízeného oboru název definovaný tam skryje všechny položky definované se stejným názvem v nadřazených oborech.
Pokud se nepoužije zápis dot zdroje (§3.5.5), vytvoří se nový rozsah:
- Soubor skriptu
- Blok skriptu
- Funkce nebo filtr
Podívejte se na následující příklad:
# 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
Obor proměnných $x a $y vytvořený ve skriptu je tělo tohoto skriptu, včetně funkce definované uvnitř skriptu. Funkce Get-Power definuje dva parametry se stejnými názvy.
Vzhledem k tomu, že každá funkce má vlastní obor, tyto proměnné se liší od proměnných definovaných v nadřazené oblasti a skryjí je z nadřazeného oboru. Obor funkce je vnořený uvnitř oboru skriptu.
Všimněte si, že funkce se volá rekurzivně. Pokaždé, když to udělá, vytvoří ještě další vnořený obor, každý s vlastními proměnnými $x a $y.
Tady je složitější příklad, který také zobrazuje vnořené obory a opakované použití názvů:
# 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 Názvy a čísla oboru
PowerShell podporuje následující obory:
Globální: Toto je obor nejvyšší úrovně. V tomto oboru jsou definovány všechny automatické proměnné a proměnné předvoleb. Globální obor je nadřazený obor všech ostatních oborů a všechny ostatní obory jsou podřízené obory globálního oboru.
Místní: Toto je aktuální obor v libovolném bodu spuštění v rámci skriptu, bloku skriptu nebo funkce. Libovolný obor může být místní obor.
Skript: Tento obor existuje pro každý spuštěný soubor skriptu. Obor skriptu je nadřazený obor všech oborů vytvořených z něj. Blok skriptu nemá vlastní obor skriptu; místo toho je obor skriptu jeho nejbližšího nadřazeného souboru skriptu. I když obor modulu neexistuje, rozsah skriptu poskytuje ekvivalent.
Názvy mohou být deklarovány jako soukromé, v takovém případě nejsou viditelné mimo nadřazený obor, ani pro podřízené obory. Koncept soukromého není samostatným oborem; je to alias pro místní obor s přidáním skrytí názvu, pokud se používá jako zapisovatelné umístění.
Obory mohou být odkazovány číslem, které popisuje relativní pozici jednoho oboru na jiný. Obor 0 označuje místní obor, obor 1 označuje nadřazený obor 1 generace, obor 2 označuje obor 2 generace nadřazeného oboru atd. (Čísla oborů používají rutiny, které manipulují s proměnnými.)
3.5.3 Rozsah názvu proměnné
Jak je znázorněno v následujícím produkčním prostředí, je možné zadat název proměnné s libovolným ze šesti různých oborů:
variable-scope:
Global:
Local:
Private:
Script:
Using:
Workflow:
variable-namespace
Obor je volitelný. Následující tabulka ukazuje význam každého z nich ve všech možných kontextech. Zobrazuje také obor, pokud není explicitně zadán žádný obor:
| Modifikátor oboru | V souboru skriptu | V rámci bloku skriptu | Uvnitř funkce |
|---|---|---|---|
| Globální | Globální obor | Globální obor | Globální obor |
| Scénář | Nejbližší obor souboru nadřazených skriptů nebo globální soubor, pokud neexistuje nejbližší soubor nadřazených skriptů | Nejbližší obor souboru nadřazených skriptů nebo globální soubor, pokud neexistuje nejbližší soubor nadřazených skriptů | Nejbližší obor souboru nadřazených skriptů nebo globální soubor, pokud neexistuje nejbližší soubor nadřazených skriptů |
| Soukromý | Globální/skript/místní obor | Místní obor | Místní obor |
| Místní | Globální/skript/místní obor | Místní obor | Místní obor |
| Using | Definice implementace | Definice implementace | Definice implementace |
| Workflow | Definice implementace | Definice implementace | Definice implementace |
| Žádné | Globální/skript/místní obor | Místní obor | Místní obor |
Informace o rozsahu proměnných lze zadat také při použití řady rutin uvedených v (§3.1.5). Konkrétně se podívejte na parametr Scopea parametry Option Private a Option AllScope další informace.
Using: Modifikátor oboru se používá pro přístup k proměnným definovaným v jiném oboru při spouštění skriptů prostřednictvím rutin, jako je Start-Job, Invoke-Commandnebo v rámci inlinescript-statement. Například:
$a = 42
Invoke-Command --ComputerName RemoteServer { $Using:a } # returns 42
workflow foo
{
$b = "Hello"
inlinescript { $Using:b }
}
foo # returns "Hello"
Pracovní postup oboru se používá s příkazem parallel nebo sequence-statement pro přístup k proměnné definované v pracovním postupu.
3.5.4 Rozsah názvu funkce
Název funkce může mít také jeden ze čtyř různých oborů a viditelnost tohoto názvu je stejná jako u proměnných (§3.5.3).
3.5.5 Zápis zdroje s tečkou
Když se soubor skriptu, blok skriptu nebo funkce spustí z jiného souboru skriptu, bloku skriptu nebo funkce, vytvoří spuštěný soubor skriptu nový vnořený obor. Příklad:
Script1.ps1
& "Script1.ps1"
& { ... }
FunctionA
Pokud se ale použije zápis tečkovaného zdroje , před provedením příkazu se nevytvořil žádný nový obor, takže přidání a změny, které by provedly ve vlastním místním oboru, se místo toho provedou do aktuálního oboru. Příklad:
. Script2.ps1
. "Script2.ps1"
. { ... }
. FunctionA
Moduly 3.5.6
Stejně jako soubor skriptu nejvyšší úrovně je v kořenovém adresáři hierarchického vnořeného stromu oboru, takže je to také každý modul (§3.14). Ve výchozím nastavení jsou ale názvy exportované modulem dostupné podle názvu v kontextu importu. Globální parametr rutiny Import-Module umožňuje exportovaným názvům zvýšit viditelnost.
3.6 Jen pro čtení a konstantní vlastnosti
Proměnné a aliasy jsou popsány objekty, které obsahují řadu vlastností. Tyto vlastnosti jsou nastaveny a manipulovány dvěma rodinami rutin (§3.1.5, §3.1.1). Jednou z těchto vlastností je Options, které lze nastavit na ReadOnly nebo Constant (pomocí parametru Option). Proměnnou nebo alias označený jako ReadOnly lze odebrat a jeho vlastnosti lze změnit za předpokladu, že je zadán parametr Force. Proměnnou nebo alias označenou konstantou však nelze odebrat ani změnit její vlastnosti.
3.7 Přetížení metod a řešení volání
3.7.1 Úvod
Jak je uvedeno v §1, externí postup zpřístupněný spouštěcím prostředím (a napsaný v jiném jazyce než PowerShell) se nazývá metoda.
Název metody spolu s počtem a typy jeho parametrů se souhrnně nazývá podpis této metody. (Všimněte si, že podpis neobsahuje návratový typ metody.) Spouštěcí prostředí může povolit, aby typ měl více metod se stejným názvem, pokud každý z nich má jiný podpis. Pokud je definováno více verzí některé metody, tato metoda je označena jako přetížená. Například typ Matematika (§4.3.8) obsahuje sadu metod s názvem Abs, která vypočítá absolutní hodnotu zadaného čísla, kde zadané číslo může mít jeden z několika typů. Metody v této sadě mají následující podpisy:
Abs(decimal)
Abs(float)
Abs(double)
Abs(int)
Abs(long)
Abs(SByte)
Abs(Int16)
V tomto případě mají všechny metody stejný počet argumentů; jejich podpisy se liší pouze podle typu argumentu.
Dalším příkladem je typ Array (§4.3.2), který obsahuje sadu metod s názvem Kopírovat, která kopíruje rozsah prvků z jednoho pole do druhého, počínaje na začátku každé matice (ve výchozím nastavení) nebo u některého určeného prvku. Metody v této sadě mají následující podpisy:
Copy(Array, Array, int)
Copy(Array, Array, long)
Copy(Array, int, Array, int, int)
Copy(Array, long, Array, long, long)
V tomto případě se podpisy liší podle typu argumentu a v některých případech také podle čísla argumentu.
Ve většině volání přetížených metod číslo a typ argumentů předané přesně odpovídají jednomu z přetížení a vybraná metoda je zřejmé. Pokud tomu tak ale není, musí existovat způsob, jak vyřešit přetíženou verzi, která se má volat, pokud existuje. Příklad:
[Math]::Abs([byte]10) # no overload takes type byte
[array]::Copy($source, 3, $dest, 5L, 4) # both int and long indexes
Mezi další příklady patří řetězec typu (tj. System.String), který má mnoho přetížených metod.
I když PowerShell obsahuje pravidla pro překlad volání metod, která přesně neodpovídají přetíženému podpisu, PowerShell sám neposkytuje způsob, jak definovat přetížené metody.
Poznámka:
Poznámka editoru: PowerShell 5.0 přidal možnost definovat třídy založené na skriptech. Tyto třídy mohou obsahovat přetížené metody.
3.7.2 Rozlišení přetížení metody
Vzhledem k volání metody (§7.1.3) se seznamem výrazů argumentů a sada metod kandidátských metod(tj. metod, které lze volat), mechanismus pro výběr nejlepší metody se nazývá řešení přetížení.
S ohledem na sadu použitelných metod kandidáta (§3.7.3) je vybrána nejlepší metoda v této sadě. Pokud sada obsahuje pouze jednu metodu, je tato metoda nejlepší. V opačném případě je nejlepší metoda, která je lepší než všechny ostatní metody s ohledem na daný seznam argumentů pomocí pravidel uvedených v §3.7.4. Pokud neexistuje přesně jedna metoda, která je lepší než všechny ostatní metody, je vyvolání metody nejednoznačné a zobrazí se chyba.
Nejlepší metoda musí být přístupná v kontextu, ve kterém je volána. Například skript PowerShellu nemůže volat metodu, která je soukromá nebo chráněná.
Nejlepší metodou volání statické metody musí být statická metoda a nejlepší metodou volání metody instance musí být metoda instance.
3.7.3 Použitelná metoda
Metoda se říká, že je použitelná s ohledem na seznam argumentů A, pokud je splněna jedna z následujících možností:
- Počet argumentů v A je identický s počtem parametrů, které metoda přijímá.
- Metoda obsahuje požadované parametry M a volitelné parametry N a počet argumentů v A je větší nebo roven M, ale menší než N.
- Metoda přijímá proměnný počet argumentů a počet argumentů v A je větší než počet parametrů, které metoda přijímá.
Kromě toho, že má odpovídající počet argumentů, musí každý argument v argumentu A odpovídat režimu předávání parametrů a typ argumentu musí odpovídat typu parametru nebo musí existovat převod z typu argumentu na typ parametru.
Pokud je typ argumentu odkaz (§4.3.6), musí být odpovídající parametr také odkaz a typ argumentu pro účely převodu je typ vlastnosti Hodnota z argumentu odkaz.
Pokud je reftyp argumentu , může být out odpovídající parametr místo ref.
Pokud metoda přijímá proměnlivý počet argumentů, může být metoda použitelná buď v normálním formátu , nebo rozšířeném formuláři. Pokud je počet argumentů v A identický s počtem parametrů, které metoda přijme, a poslední parametr je matice, pak formulář závisí na pořadí jednoho ze dvou možných převodů:
- Pořadí převodu z typu posledního argumentu v A na typ pole pro poslední parametr.
- Pořadí převodu z typu posledního argumentu v A na typ prvku typu pole pro poslední parametr.
Pokud je první převod (na typ pole) lepší než druhý převod (na typ prvku pole), je metoda použitelná v normální podobě, jinak je použitelná v rozšířené podobě.
Pokud existuje více argumentů než parametrů, může být metoda použitelná pouze v rozšířené podobě. Aby bylo možné použít v rozšířené podobě, musí mít poslední parametr typ pole. Metoda je nahrazena ekvivalentní metodou, která má poslední parametr nahrazen dostatečnými parametry pro účet každého chybějícího argumentu v A. Každý další typ parametru je typ prvku typu pole pro poslední parametr v původní metodě. Výše uvedená pravidla pro platnou metodu se použijí pro tuto novou metodu a seznam argumentů A.
3.7.4 Lepší metoda
Vzhledem k seznamu argumentů A se sadou výrazů argumentů { E~1~, E~2~, ..., E~N~ } a dvěma metodami M~P~ aplikace a M~Q~ s typy { P~1~, P~2~, ..., P~N~ } parametrů a M~P~{ Q~1~, Q~2~, ..., Q~N~ }, je definován jako lepší metoda, než M~Q~ pokud je kumulativní řazení převodů pro M~P~ lepší než pro M~Q~.
Kumulativní řazení převodů se vypočítá následujícím způsobem. Každý převod stojí za jinou hodnotu v závislosti na počtu parametrů, s převodem E~1~ hodnoty N, E~2~ hodnota N-1, dolů na E~N~ hodnotu 1. Pokud je převod z E~X~ na P~X~ lepší než E~X~Q~X~na , M~P~ kumuluje N-X+1; jinak M~Q~ se hromadí N-X+1. Pokud M~P~ a M~Q~ mají stejnou hodnotu, použijí se následující pravidla porušení vazby v pořadí:
- Kumulativní řazení převodů mezi typy parametrů (bez ohledu na typy argumentů) se vypočítá podobným způsobem jako v předchozím pořadí, takže
P~1~se porovnává s , protiQ~1~Q~2~,P~2~..., aP~N~protiQ~N~. Porovnání se přeskočí, pokud argument byl$nullnebo pokud typy parametrů nejsou číselné typy. Porovnání se také přeskočí, pokud převodE~X~argumentu ztratí informace při převodu naP~X~, ale nepřijde o informace při převodu naQ~X~, nebo naopak. Pokud jsou typy převodu parametrů porovnány, pak pokud je převod zP~X~na lepší nežQ~X~ten od doP~X~,M~P~kumuluje N-X+1; jinakM~Q~se hromadí N-XQ~X~+1. Toto pravidlo pro svázání je určeno k tomu, aby preferuje nej specifickou metodu (tj. metodu s parametry s nejmenšími datovými typy), pokud se při převodech neztratí žádné informace, nebo preferovat nejobecnější metodu (tj. metodu s parametry s největšími datovými typy), pokud při převodech dojde ke ztrátě informací. - Pokud obě metody používají rozšířenou formu, je lepší metodou metoda s více parametry.
- Pokud jedna metoda používá rozbalený formulář a druhý používá normální formulář, je metoda používající normální formulář lepší metodou.
3.7.5 Lepší převod
Níže uvedený text je specifický pro Windows PowerShell.
Převody jsou seřazené následujícím způsobem, od nejnižších po nejvyšší:
-
T~1~[]pokudT~2~[]neexistuje žádný přiřaditelný převod meziT~1~aT~2~neexistuje - T na řetězec, kde T je jakýkoli typ
-
T~1~T~1~určeníT~2~neboT~2~definování vlastního převodu způsobem definovaným implementací -
T~1~T~1~kdeT~2~implementuje IConvertible -
T~1~T~1~kdeT~2~neboT~2~implementuje metoduT~2~ op_Implicit(T1) -
T~1~T~1~kdeT~2~neboT~2~implementuje metoduT~2~ op_Explicit(T1) -
T~1~na místo, kdeT~2~T~2~implementuje konstruktor, který přebírá jeden argument typuT~1~ - Jeden z následujících převodů:
- řetězec, do
TkteréhoTimplementuje statickou metoduT Parse(string)neboT Parse(string, IFormatProvider) -
T~1~T~2~kdeT~2~je jakýkoli výčet aT~1~je buď řetězec, nebo kolekce objektů, které lze převést na řetězec
- řetězec, do
-
Tto PSObject whereTis any type - Jakýkoli z následujících převodů:
Language- T to bool where
Tis any numeric type - řetězec na
Tmísto, kdeTjeregex,wmisearcher,adsiwmiwmiclass, , ,adsisearcher, nebotype -
Tnabool - T~1~ na místo, kde
Nullable[T~2~]existuje převod zT~1~naT~2~ -
Tna void -
T~1~[]k tomu, kdeT~2~[]lze přiřaditelný převod meziT~1~aT~2~existuje -
T~1~na místo, kdeT~2~[]T~1~je kolekce -
IDictionarynaHashtable -
Tnaref -
Tnaxml -
scriptblocknadelegate -
T~1~T~1~whereT~2~is an integer type andT~2~is an enum
- T to bool where
-
$nullna místo, kdeTTje jakýkoli typ hodnoty -
$nullna místo, kdeTTje jakýkoliv odkazový typ - Jakýkoli z následujících převodů:
byte to
TwhereTisSByteUInt16na místo, kdeTTjeSByte,byteneboInt16Int16naTmísto, kdeTjeSBytenebobyteUInt32naTmísto, kdeTjeSByte,byte,Int16,UInt16nebointintna místo, kdeTTjeSByte,byteInt16neboUInt16UInt64naTmísto, kdeTjeSByte, ,intbyteInt16UInt16UInt32nebolonglongnaTmísto, kdeTjeSByte, ,UInt16byteInt16,int, neboUInt32floatdoTumístěníTlibovolného celočíselného typu nebodecimaldoubledoTumístěníTlibovolného celočíselného typu nebodecimaldecimaldoTumístěníTlibovolného celočíselného typu
- Jakýkoli z následujících převodů:
-
SBytena místo, kdeTTjebyte,uint6UInt32neboUInt64 -
Int16na místo, kdeTTjeUInt16,UInt32neboUInt64 -
intnaTmísto, kdeTjeUInt32neboUInt64 -
longnaUInt64 -
decimalnaTmísto, kdeTjefloatnebodouble
-
- Jakýkoli z následujících převodů:
-
TdostringumístěníTlibovolného číselného typu -
TdocharumístěníTlibovolného číselného typu -
stringdoTumístěníTlibovolného číselného typu
-
- Každý z následujících převodů se považuje za přiřaditelné převody:
-
bytenaTmísto, kdeTjeInt16,UInt16,int,UInt64singleUInt32long, nebodoubledecimal -
SBytenaTmísto, kdeTjeInt16,UInt16,int,UInt64singleUInt32long, nebodoubledecimal -
UInt16naTmísto, kdeTjeint,UInt32,longnebosingleUInt64, ,doublenebodecimal -
Int16naTmísto, kdeTjeint,UInt32,longnebosingleUInt64, ,doublenebodecimal -
UInt32naTmísto, kdeTjelong, neboUInt64single,doublenebo , nebodecimal -
intnaTmísto, kdeTjelong,UInt64,single,doublenebodecimal -
singlenadouble
-
-
T~1~T~2~kdeT~2~je základní třída nebo rozhraníT~1~. Tento převod se považuje za přiřaditelný převod. -
stringnachar[] -
T-T- Tento převod je považován za přiřaditelný převod.
Pro každý převod formuláře T~1~ na T~2~[] místo, kde T~1~ není matice a žádný jiný převod platí, pokud existuje převod z T~1~ na T~2~, pořadí převodu je horší než převod z T~1~ na T~2~, ale lepší než jakýkoli převod seřazený méně než převod z T~1~ na T~2~
3.8 Název vyhledávání
Příkazy různých druhů mohou mít stejný název. Pořadí, ve kterém se vyhledávání názvů provádí v takovém případě, je alias, funkce, rutina a externí příkaz.
3.9 Vyhledání názvu typu
§7.1.10 obsahuje příkaz" Literál typu je reprezentován v implementaci některými nespecifikovanými podkladovými typy. V důsledku toho je název typu synonymem pro jeho základní typ." Příkladem typů jsou int, double, long[]a Hashtable.
Názvy typů se shodují takto: Porovnejte zadaný název typu se seznamem předdefinovaných akcelerátorů typů, například int, long, double. Pokud se najde shoda, jedná se o typ. V opačném případě se předpokládá, že je název typu plně kvalifikovaný, a zjistěte, jestli takový typ existuje v hostitelském systému. Pokud se najde shoda, jedná se o typ. V opačném případě přidejte předponu System.oboru názvů . Pokud se najde shoda, jedná se o typ. V opačném případě je název typu chybný. Tento algoritmus se použije pro každý argument typu pro obecné typy. Není však nutné zadávat arity (počet argumentů nebo operandů pořízených funkcí nebo operátorem).
3.10 Automatická správa paměti
Různé operátory a rutiny vedou k přidělení paměti pro objekty referenčního typu, jako jsou řetězce a pole. Přidělení a uvolnění této paměti spravuje systém modulu runtime PowerShellu. To znamená, že PowerShell poskytuje automatické uvolňování paměti.
3.11 Pořadí provedení
Vedlejším účinkem je změna stavu spouštěcího prostředí příkazu. Změna hodnoty proměnné (prostřednictvím operátorů přiřazení nebo operátorů před a po přírůstku a dekrementace) je vedlejší účinek, stejně jako změna obsahu souboru.
Pokud není uvedeno jinak, příkazy se provádějí v lexikálním pořadí.
Kromě toho, jak je uvedeno u některých operátorů, pořadí vyhodnocení termínů ve výrazu a pořadí, ve kterém probíhají vedlejší účinky, jsou oba nespecifikované.
Výraz, který vyvolá příkaz, zahrnuje výraz, který určuje příkaz, a nula nebo více výrazů, které určují argumenty, jejichž hodnoty mají být předány danému příkazu. Pořadí, ve kterém jsou tyto výrazy vyhodnoceny vzhledem k sobě navzájem, není zadáno.
3.12 Zpracování chyb
Pokud příkaz selže, považuje se to za chybu a informace o této chybě se zaznamenávají do záznamu chyby, jehož typ není zadán (§4.5.15); tento typ však podporuje dolní indexování.
Chyba spadá do jedné ze dvou kategorií. Buď operaci ukončí ( ukončující chyba), nebo ne ( neukončující chyba). Při ukončovací chybě se chyba zaznamená a operace se zastaví. Při neukončující chybě se chyba zaznamená a operace pokračuje.
Neukončující chyby se zapisují do datového proudu chyb. I když je možné tyto informace přesměrovat na soubor, objekty chyby jsou nejprve převedeny na řetězce a důležité informace v těchto objektech by nebyly zachyceny, aby diagnostika byla obtížná, pokud není nemožné. Místo toho lze text chyby přesměrovat (§7.12) a objekt chyby uložený v proměnné, jako v $Error1 = command 2>&1.
Automatická proměnná $Error obsahuje kolekci záznamů chyb, které představují poslední chyby, a nejnovější chyba je v $Error[0]. Tato kolekce je zachována ve vyrovnávací paměti, aby staré záznamy byly zahozeny při přidávání nových záznamů. Automatická proměnná $MaximumErrorCount řídí počet záznamů, které lze uložit.
$Error obsahuje všechny chyby ze všech příkazů smíšených v jedné kolekci. Chcete-li shromáždit chyby z konkrétního příkazu, použijte společný parametr ErrorVariable, který umožňuje zadat uživatelem definovanou proměnnou pro uložení kolekce.
3.13 Kanály
Kanál je řada jednoho nebo více příkazů oddělených operátorem | kanálu (U+007C).
Každý příkaz přijímá vstup od předchůdce a zapisuje výstup do následníka. Pokud se výstup na konci kanálu nezahodí nebo přesměruje do souboru, odešle se do hostitelského prostředí, které se může rozhodnout, že se zapíše do standardního výstupu. Příkazy v kanálu můžou také přijímat vstupy z argumentů. Představte si například následující použití příkazů Get-ChildItem, Sort-Objecta Process-File, které vytvoří seznam názvů souborů v daném adresáři systému souborů, seřadí sadu textových záznamů a provede určité zpracování textového záznamu, v uvedeném pořadí:
Get-ChildItem
Get-ChildItem E:*.txt | Sort-Object -CaseSensitive | Process-File >results.txt
V prvním případě Get-ChildItem vytvoří kolekci názvů souborů v aktuálním nebo výchozím adresáři. Tato kolekce se odešle do hostitelského prostředí, které ve výchozím nastavení zapisuje hodnotu každého prvku do standardního výstupu.
V druhém případě Get-ChildItem vytvoří kolekci názvů souborů v zadaném adresáři pomocí argumentu E:*.txt. Tato kolekce se zapíše do příkazu Sort-Object, který je ve výchozím nastavení seřadí ve vzestupném pořadí a rozlišují se na malá a velká písmena (na základě argumentu Nerozlišující malá a velká písmena). Výsledná kolekce se pak zapíše do příkazu Process-File, který provádí některé (neznámé) zpracování. Výstup z příkazu se pak přesměruje do souboru results.txt.
Pokud příkaz zapíše jeden objekt, jeho následník tento objekt přijme a potom se ukončí po napsání vlastních objektů jeho následníkovi. Pokud však příkaz zapíše více objektů, doručí se po jednom na následník příkaz, který se provede jednou pro každý objekt. Toto chování se nazývá streamování. Při zpracování datových proudů se objekty zapisují podél kanálu, jakmile budou k dispozici, a ne při vytváření celé kolekce.
Při zpracování kolekce lze příkaz zapsat tak, aby mohl provádět speciální zpracování před počátečním prvkem a za posledním prvkem.
3.14 Moduly
Modul je samostatná opakovaně použitelná jednotka, která umožňuje dělit, uspořádat a abstrahovat kód PowerShellu. Modul může obsahovat příkazy (například rutiny a funkce) a položky (například proměnné a aliasy), které je možné použít jako jednu jednotku.
Po vytvoření modulu je nutné ho naimportovat do relace, aby bylo možné použít příkazy a položky v něm. Po importu se příkazy a položky chovají tak, jako by byly definované místně. Modul se pomocí příkazu naimportuje explicitně Import-Module . Modul se také může importovat automaticky podle definice implementace.
Typ objektu, který představuje modul, je popsán v §4.5.12.
Moduly jsou podrobně popsány v §11.
3.15 Výrazy se zástupnými cardy
Výraz se zástupným znakem může obsahovat nula nebo více následujících prvků:
| prvek | Popis |
|---|---|
| Znak jiný než *, ?, nebo [ | Odpovídá jednomu znaku. |
| * | Odpovídá nule nebo více znaků. Chcete-li spárovat znak *, použijte [*]. |
| ? | Odpovídá libovolnému znaku. Chcete-li se shodovat s ? znak, použijte [?]. |
| [set] | Odpovídá jakémukoli znaku ze sady, který nemůže být prázdný. Pokud sada začíná ], je tato pravá hranatá závorka považována za součást sady a další pravá hranatá závorka ukončí sadu; jinak první pravá hranatá závorka ukončí sadu. Pokud sada začíná nebo končí -, je tato pomlčka-minus považována za součást množiny; v opačném případě označuje rozsah po sobě jdoucích bodů kódu Unicode se znaky na obou stranách spojovníku minus jsou oddělovačem inkluzivního rozsahu. A-Z například označuje 26 velkých písmen anglické abecedy a 0-9 označuje 10 desetinných číslic. |
Poznámka:
Další informace naleznete v, The Open Group Base Specifikace: Pattern Matching", IEEE Std 1003.1, 2004 Edition.. V PowerShellu je však řídicí znak zpětný, nikoli zpětné lomítko.
3.16 Regulární výrazy
Regulární výraz může obsahovat nula nebo více následujících prvků:
| prvek | Popis |
|---|---|
| Znak jiný než ., [, ^, *, $nebo \ | Odpovídá jednomu znaku. |
| . | Odpovídá libovolnému znaku. Chcete-li se shodovat s . character, use \.. |
| [set] [^set] |
Formulář [set] odpovídá libovolnému znaku ze sady. Formulář [^set] neodpovídá žádným znakům ze sady. sada nemůže být prázdná. Pokud sada začíná ] nebo ^], je tato pravá hranatá závorka považována za součást sady a další pravá hranatá závorka ukončí sadu; jinak první pravá hranatá závorka ukončí sadu. Pokud sada začíná - nebo ^-, nebo končí -, je tato pomlčka minus považována za součást množiny; v opačném případě označuje rozsah po sobě jdoucích bodů kódu Unicode se znaky na obou stranách spojovníku minus jsou oddělovačem inkluzivního rozsahu. A-Z například označuje 26 velkých písmen anglické abecedy a 0-9 označuje 10 desetinných číslic. |
| * | Odpovídá nule více výskytů předchozího prvku. |
| + | Odpovídá jednomu z více výskytů předchozího prvku. |
| ? | Odpovídá nule jednoho výskytu předchozího prvku. |
| ^ | Odpovídá na začátku řetězce. Chcete-li spárovat znak ^, použijte \^. |
| $ | Odpovídá na konci řetězce. Chcete-li spárovat znak $, použijte $. |
| \ c | Řídicí znak c, takže se nerozpozná jako element regulárního výrazu. |
Poznámka:
Další informace naleznete v sadě Open Group Base Specifikace: Regulární výrazy, IEEE Std 1003.1, 2004 Edition..
Windows PowerShell: Třídy znaků dostupné v regulárních výrazech rozhraní Microsoft .NET Framework jsou podporovány následujícím způsobem:
| prvek | Popis |
|---|---|
\p{name} |
Odpovídá libovolnému znaku v pojmenované třídě znaků určené názvem. Podporované názvy jsou skupiny Unicode a blokové oblasti, jako jsou Ll, Nd, Z, IsGreek a IsBoxDrawing. |
\P{name} |
Odpovídá textu, který není součástí skupin a rozsahů bloků zadaných v názvu. |
\w |
Odpovídá libovolnému znaku slova. Ekvivalentní kategoriím [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]znaků Unicode . Pokud je u možnosti ECMAScriptu zadáno chování kompatibilní s ECMAScriptem, je \w ekvivalentní [a-zA-Z_0-9]. |
\W |
Odpovídá libovolnému neslovně danému znaku. Ekvivalentní kategoriím [\^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]Unicode . |
\s |
Odpovídá jakémukoli prázdnému znaku. Ekvivalentní kategoriím [\f\n\r\t\v\x85\p{Z}] znaků Unicode. |
\S |
Odpovídá jakémukoli prázdnému znaku. Ekvivalentní kategoriím [\^\f\n\r\t\v\x85\p{Z}]znaků Unicode . |
\d |
Odpovídá libovolné desítkové číslici.
\p{Nd} Ekvivalent pro kódování Unicode a [0-9] chování jiného typu než Unicode |
\D |
Odpovídá libovolné neciferné sadě.
\P{Nd} Ekvivalent pro kódování Unicode a [\^0-9] chování jiného typu než Unicode |
Kvantifikátory dostupné v regulárních výrazech rozhraní Microsoft .NET Framework jsou podporované následujícím způsobem:
| prvek | Popis |
|---|---|
* |
Určuje nulovou nebo více shod; například \w* nebo (abc)*. ekvivalent .{0,} |
+ |
Odpovídá opakujícím se instancím předchozích znaků. |
? |
Určuje nulovou nebo jednu shodu; například \w? nebo (abc)?. Ekvivalent k {0,1}. |
{n} |
Určuje přesně n shod ; například (pizza){2}. |
{n,} |
Určuje alespoň n shod ; například (abc){2,}. |
{n,m} |
Určuje alespoň n, ale ne více než m, odpovídá. |