Sdílet prostřednictvím


5. Proměnné

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.

Proměnná představuje umístění úložiště pro hodnotu a tato hodnota má typ. Tradiční procedurální programovací jazyky jsou staticky typované; to znamená, že typ proměnné za běhu je ten, se kterým byla deklarována při kompilaci. Objektově orientované jazyky přidávají myšlenku dědičnosti, což umožňuje, aby typ proměnné za běhu programu byl tím, s kterým byla deklarována v době kompilace, nebo nějakým typem odvozeným z tohoto typu. Proměnné v PowerShellu, jakožto dynamicky typovaném jazyce, samy o sobě nemají typy. Ve skutečnosti nejsou proměnné definovány; při prvním přiřazení hodnoty se jednoduše objeví. A i když může být proměnná omezena (§5,3) pro uchovávání hodnoty daného typu, informace o typu v přiřazení nelze vždy ověřit staticky.

V různých časech může být proměnná spojena s hodnotami různých typů buď prostřednictvím přiřazení (§7.11) nebo použití ++ a ‑‑ operátorů (§7.1.5, §7.2.6). Pokud se změní hodnota přidružená k proměnné, může se typ této hodnoty změnit. Například

$i = "abc"        # $i holds a value of type string
$i = 2147483647   # $i holds a value of type int
++$i              # $i now holds a value of type double because
                  # 2147483648 is too big to fit in type int

Jakékoli použití proměnné, která nebyla vytvořena, má za následek hodnotu $null. Pokud chcete zjistit, jestli je proměnná definovaná, použijte rutinu Test-Path.

5.1 Zapisovatelné umístění

zapisovatelný prostor je výraz, který určuje prostředek, ke kterému má příkaz přístup k čtení i zápisu. Zapisovatelné umístění může být proměnná (§5), prvek pole (§9), přidružená hodnota v hashtabulce přístupné pomocí indexu (§10), vlastnost (§7.1.2) nebo úložiště spravované poskytovatelem (§3.1).

5.2 Kategorie proměnných

PowerShell definuje následující kategorie proměnných: statické proměnné, instanční proměnné, prvky pole, klíčové/hodnotové páry tabulky hash, parametry, běžné proměnné a proměnné na jednotkách poskytovatele. Pododdíly, které následují, popisují každou z těchto kategorií.

V následujícím příkladu

function F ($p1, $p2) {
    $radius = 2.45
    $circumference = 2 * ([Math]::PI) * $radius

    $date = Get-Date -Date "2010-2-1 10:12:14 pm"
    $month = $date.Month

    $values = 10, 55, 93, 102
    $value = $values[2]

    $h1 = @{ FirstName = "James"; LastName = "Anderson" }
    $h1.FirstName = "Smith"

    $Alias:A = "Help"
    $Env:MyPath = "E:\Temp"
    ${E:output.txt} = 123
    $Function:F = { "Hello there" }
    $Variable:v = 10
}
  • [Math::PI] je statická proměnná.
  • $date.Month je proměnná instance.
  • $values[2] je prvek pole.
  • $h1.FirstName je klíč Hashtable, jehož odpovídající hodnota je $h 1['FirstName']'
  • $p1 a $p2 jsou parametry
  • $radius, $circumference, $date, $month, $values, $valuea $h1 jsou běžné proměnné
  • $Alias:A, $Env:MyPath, ${E:output.txt}a $Function:F jsou proměnné na odpovídajících jednotkách poskytovatele.
  • $Variable:v je ve skutečnosti obyčejná proměnná napsaná s použitím úplně specifikovaného úložiště poskytovatele.

5.2.1 Statické proměnné

Datový člen objektu, který patří k typu objektu, nikoli k dané konkrétní instanci typu, se nazývá statická proměnná. Příklady najdete v §4.2.3, §4.2.4.1a §4.3.8.

PowerShell neposkytuje žádný způsob, jak vytvořit nové typy, které obsahují statické proměnné; objekty těchto typů však mohou být poskytovány hostitelským prostředím.

Paměť pro vytváření a odstraňování objektů obsahujících statické proměnné je spravována hostitelským prostředím a systémem garbage collection.

Informace o přístupu ke statické proměnné najdete v §7.1.2.

Statickým datovým členem může být pole nebo vlastnost.

5.2.2 Proměnné instance

Datový člen objektu, který patří do konkrétní instance typu objektu, nikoli k samotnému typu, se nazývá proměnná instance . Příklady najdete v §4.3.1, §4.3.2a §4.3.3.

Hostitelské prostředí PowerShellu může poskytnout způsob, jak vytvořit nové typy obsahující proměnné instance nebo přidat nové proměnné instance do existujících typů.

Paměť pro vytváření a odstraňování objektů obsahujících statické proměnné je spravována hostitelským prostředím a systémem garbage collection.

Informace o přístupu k proměnné instance najdete v §7.1.2.

Datovým členem instance může být pole nebo vlastnost.

5.2.3 Prvky pole

Pole lze vytvořit pomocí unárního operátoru čárky (§7.2.1), dílčího výrazu (§7.1.6), výrazu pole (§7.1.7), binárního operátoru čárky (§7.3), operátoru rozsahu (§7.4) nebo cmdletu New-Object.

Správu paměti pro vytváření a mazání polí zajišťuje hostitelské prostředí spolu se systémem správy paměti.

Pole a maticové prvky jsou popsány v §9.

5.2.4 Páry klíč/hodnota hashovací tabulky

Hashtable se vytvoří pomocí hashového literálu (§2.3.5.6) nebo pomocí cmdletu New-Object. Nový pár klíč/hodnota lze přidat pomocí operátoru [] (§7.1.4.3).

Paměť pro vytváření a odstraňování hašovacích tabulek je spravována hostitelským prostředím a systémem správy paměti.

Hašovací tabulky jsou popsány v §10.

5.2.5 Parametry

Parametr se vytvoří při vyvolání nadřazeného příkazu a inicializuje se hodnotou argumentu zadaného ve volání nebo hostitelském prostředí. Parametr přestane existovat, když se ukončí nadřazený příkaz.

Parametry jsou popsány v §8.10.

5.2.6 Běžné proměnné

obyčejná proměnná je definována výrazem přiřazení (§7.11) nebo foreach-příkazem (§8.4.4). Některé běžné proměnné jsou předdefinované hostitelským prostředím, zatímco jiné jsou přechodné a přicházejí podle potřeby za běhu.

Životnost běžné proměnné je doba během provádění programu, kdy je zaručeno, že je pro ni vyhrazeno úložiště. Tato doba života začíná vstupem do oboru, ke kterému je přidružena, a končí ne dříve než konec provádění tohoto oboru. Pokud je nadřazený obor zadán rekurzivně nebo iterativním způsobem, vytvoří se pokaždé nová instance místní proměnné.

Úložiště, na které odkazuje běžná proměnná, se uvolní nezávisle na životnosti této proměnné.

Obyčejnou proměnnou lze explicitně pojmenovat s využitím předpony oboru názvů Variable: (§5.2.7).

5.2.7 Proměnné na jednotkách poskytovatele

Koncept poskytovatelů a jednotek je představen v §3.1, přičemž každý poskytovatel může poskytnout své vlastní jednotky prostoru názvů. To umožňuje přístup k prostředkům na těchto jednotkách, jako by šlo o běžné proměnné (§5.2.6). Ve skutečnosti je běžná proměnná uložena na jednotce poskytovatele systému souborů: (§3.1.5) a lze k ní přistupovat běžným názvem nebo plně kvalifikovaným názvem prostoru názvů.

Některé typy proměnných oboru názvů jsou omezeny implicitně (§5.3).

5.3 Omezené proměnné

Ve výchozím nastavení může proměnná určit hodnotu libovolného typu. Proměnná však může být omezena na určení hodnot daného typu zadáním tohoto typu jako literálu typu před jeho názvem v přiřazení nebo parametru. Například

[int]$i = 10   # constrains $i to designating ints only
$i = "Hello"   # error, no conversion to int
$i = "0x10"    # ok, conversion to int
$i = $true     # ok, conversion to int

function F ([int]$p1, [switch]$p2, [regex]$p3) { ... }

Jakákoli proměnná náležející k oboru názvů Env:, Alias:nebo oboru názvů systému souborů (§2.3.2, §3.1) je implicitně omezena na typ string. Libovolná proměnná, která patří do oboru názvů Funkce: (§2.3.2, §3.1) je implicitně omezena na typ scriptblock.