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.
Krátký popis
Popisuje pole, což jsou datové struktury určené k ukládání kolekcí položek.
Dlouhý popis
Pole je datová struktura, která je určena k ukládání kolekce položek. Položky mohou být stejného typu nebo různých typů.
Počínaje Windows PowerShell 3.0 má kolekce nula nebo jednoho objektu některé vlastnosti polí.
Vytvoření a inicializace pole
Chcete-li vytvořit a inicializovat pole, přiřaďte proměnné více hodnot. Hodnoty uložené v poli jsou odděleny čárkou a odděleny od názvu proměnné operátorem přiřazení (=).
Chcete-li například vytvořit pole s názvem $A, které obsahuje sedm číselných hodnot (int) 22, 5, 10, 8, 12, 9 a 80, zadejte:
$A = 22,5,10,8,12,9,80
Pole můžete také vytvořit a inicializovat pomocí operátoru rozsahu (..). Chcete-li například vytvořit a inicializovat pole s názvem "$B", které obsahuje hodnoty 5 až 8, zadejte:
$B = 5..8
Výsledkem je, že $B obsahuje čtyři hodnoty: 5, 6, 7 a 8.
Pokud není zadán žádný datový typ, PowerShell vytvoří každé pole jako pole objektů (typ: System.Object[]). Chcete-li určit datový typ pole, použijte metodu GetType(). Chcete-li například určit datový typ pole $a, zadejte:
$a.GetType()
Chcete-li vytvořit pole se silnými typy, tj. pole, které může obsahovat pouze hodnoty určitého typu, přetypujte proměnnou jako typ pole, například string[], long[] nebo int32[]. Chcete-li přetypovat pole, zadejte před název proměnné typ pole uzavřený v závorkách. Chcete-li například vytvořit 32bitové celočíselné pole s názvem $ia obsahující čtyři celá čísla (1500, 2230, 3350 a 4000), zadejte:
[int32[]]$ia = 1500,2230,3350,4000
Výsledkem je, že pole $ia může obsahovat pouze celá čísla.
Můžete vytvořit pole, která jsou přetypována na libovolný podporovaný typ v rozhraní Microsoft .NET Framework. Například objekty, které Get-Process načítá, aby reprezentovaly procesy, jsou typu System.Diagnostics.Process. Chcete-li vytvořit pole procesních objektů se silnými typy, zadejte následující příkaz:
[Diagnostics.Process[]]$zz = Get-Process
Operátor dílčího výrazu pole
Operátor dílčího výrazu pole vytvoří pole, i když obsahuje nula nebo jeden objekt.
Syntaxe operátoru pole je následující:
@( ... )
Operátor pole můžete použít k vytvoření pole s nulovým nebo jedním objektem. Například:
PS> $a = @("Hello World")
PS> $a.Count
1
PS> $b = @()
PS> $b.Count
0
Operátor pole je užitečný zejména ve skriptech, když získáváte objekty, ale nevíte, kolik objektů dostanete. Například:
$p = @(Get-Process Notepad)
Další informace o operátoru dílčího výrazu pole naleznete v části about_Operators.
Přístup k prvkům pole a jejich používání
Čtení pole
Na pole můžete odkazovat pomocí názvu jeho proměnné. Chcete-li zobrazit všechny prvky v poli, zadejte název pole. Například předpokládejme, že $a je pole obsahující celá čísla 0, 1, 2 až 9; zadání:
$a
0
1
2
3
4
5
6
7
8
9
Na prvky v poli můžete odkazovat pomocí indexu, který začíná na pozici 0. Číslo indexu uzavřete do závorek. Pokud chcete například zobrazit první prvek v poli $a, zadejte:
$a[0]
0
Chcete-li zobrazit třetí prvek v $a poli, zadejte:
$a[2]
2
Část pole můžete načíst pomocí operátoru rozsahu pro index. Chcete-li například načíst druhý až pátý prvek pole, zadejte by:
$a[1..4]
1
2
3
4
Záporná čísla se počítají od konce pole. Například "-1" odkazuje na poslední prvek pole. Pokud chcete zobrazit poslední tři prvky pole, zadejte ve vzestupném pořadí indexu:
$a = 0 .. 9
$a[-3..-1]
7
8
9
Pokud zadáte záporné indexy v sestupném pořadí, váš výstup se změní.
$a = 0 .. 9
$a[-1..-3]
9
8
7
Při používání tohoto zápisu však buďte opatrní. Zápis cyklicky probíhá od koncové hranice k začátku pole.
$a = 0 .. 9
$a[2..-2]
2
1
0
9
8
Jednou z běžných chyb je také předpokládat, že $a[0..-2] odkazuje na všechny prvky pole s výjimkou posledního prvku. Odkazuje na první, poslední a druhý prvek v poli.
Operátor plus (+) můžete použít ke sloučení rozsahů se seznamem prvků v poli. Chcete-li například zobrazit elementy na indexovaných pozicích 0, 2 a 4 až 6, napište:
$a = 0 .. 9
$a[0,2+4..6]
0
2
4
5
6
Chcete-li vypsat více rozsahů a jednotlivých prvků, můžete také použít operátor plus. Chcete-li například vypsat elementy nula až dvě, čtyři až šest a element na osmé pozici:
$a = 0..9
$a[+0..2+4..6+8]
0
1
2
4
5
6
8
Iterace nad prvky pole
Můžete také použít konstrukce smyček, jako jsou smyčky ForEach, For a While, k odkazování na prvky v poli. Chcete-li například použít smyčku ForEach k zobrazení elementů v $a poli, zadejte:
$a = 0..9
foreach ($element in $a) {
$element
}
0
1
2
3
4
5
6
7
8
9
Smyčka Foreach iteruje polem a vrací každou hodnotu v poli, dokud nedosáhne konce pole.
Smyčka For je užitečná při zvyšování čítačů při zkoumání prvků v poli. Chcete-li například použít smyčku For k vrácení každé druhé hodnoty v poli, zadejte:
$a = 0..9
for ($i = 0; $i -le ($a.length - 1); $i += 2) {
$a[$i]
}
0
2
4
6
8
Smyčku While můžete použít k zobrazení prvků v poli, dokud definovaná podmínka již nebude splněna. Chcete-li například zobrazit prvky v $a poli, když je index pole menší než 4, zadejte:
$a = 0..9
$i=0
while($i -lt 4) {
$a[$i];
$i++
}
0
1
2
3
Vlastnosti polí
Počet nebo Délka nebo Dlouhá délka
Chcete-li zjistit, kolik položek je v poli, použijte vlastnost Length nebo její Count alias.
Longlength je užitečné, pokud pole obsahuje více než 2 147 483 647 prvků.
$a = 0..9
$a.Count
$a.Length
10
10
Hodnost
Vrací počet rozměrů v poli. Většina polí v PowerShellu má pouze jednu dimenzi. I když si myslíte, že budujete vícerozměrné pole; jako v následujícím příkladu:
$a = @(
@(0,1),
@("b", "c"),
@(Get-Process)
)
[int]$r = $a.Rank
"`$a rank: $r"
$a rank: 1
Vytvoření skutečně multidimenzionálního pole v prostředí PowerShell vyžaduje pomoc rozhraní .Net Framework. Jako v následujícím příkladu:
[int[,]]$rank2 = [int[,]]::new(5,5)
$rank2.rank
2
Metody polí
Jasný
Nastaví všechny hodnoty prvků na výchozí hodnotu typu prvku pole. Metoda Clear() neobnoví velikost pole.
V následujícím příkladu $a je pole objektů.
$a = 1, 2, 3
$a.Clear()
$a | % { $null -eq $_ }
True
True
True
V tomto příkladu je explicitně zadán tak, $intA aby obsahoval celá čísla.
[int[]] $intA = 1, 2, 3
$intA.Clear()
$intA
0
0
0
Pro každou
Umožňuje iterovat nad všemi prvky v poli a provést danou operaci pro každý prvek pole.
Metoda ForEach má několik přetížení, která provádějí různé operace.
ForEach(scriptblock expression)
ForEach(type convertToType)
ForEach(string propertyName)
ForEach(string propertyName, object[] newValue)
ForEach(string methodName)
ForEach(string methodName, object[] arguments)
ForEach(scriptblock expression, object[] arguments)
ForEach(výraz scriptblock)
ForEach(výraz scriptblock, argumenty object[])
Poznámka:
Syntaxe vyžaduje použití bloku skriptu. Závorky jsou volitelné.
Následující příklad ukazuje, jak použít metodu foreach. V tomto případě je záměrem vygenerovat čtvercovou hodnotu prvků v poli.
Upozorňujeme, že tato metoda byla přidána v PowerShellu v4 a není k dispozici ve verzích nižších. U předchozích verzí použijte metodu Zřetězení k rutině ForEach-Object
$a = @(0 .. 3)
$a.ForEach({ $_ * $_})
0
1
4
9
Stejně jako -ArgumentList parametr , ForEach-Objectarguments parametr umožňuje předání pole argumentů bloku skriptu nakonfigurovanému tak, aby je přijímal.
ForEach(typ convertToType)
Tuto ForEach metodu lze použít k rychlému přetypování prvků na jiný typ; následující příklad ukazuje, jak převést seznam řetězcových dat na [DateTime] typ.
@("1/1/2017", "2/1/2017", "3/1/2017").ForEach([datetime])
Sunday, January 1, 2017 12:00:00 AM
Wednesday, February 1, 2017 12:00:00 AM
Wednesday, March 1, 2017 12:00:00 AM
ForEach(název vlastnosti řetězce)
ForEach(řetězec propertyName, object[] newValue)
Metodu ForEach lze také použít k rychlému načtení nebo nastavení hodnot vlastností pro každou položku v kolekci.
# Set all LastAccessTime properties of files to the current date.
(dir 'C:\Temp').ForEach('LastAccessTime', (Get-Date))
# View the newly set LastAccessTime of all items, and find Unique entries.
(dir 'C:\Temp').ForEach('LastAccessTime') | Get-Unique
Wednesday, June 20, 2018 9:21:57 AM
ForEach(název metody řetězce)
ForEach(argumenty typu řetězce, object[])
A konečně, ForEach metody lze použít k provedení metody na každé položce v kolekci.
("one", "two", "three").ForEach("ToUpper")
ONE
TWO
THREE
Stejně jako -ArgumentList parametr , ForEach-Objectarguments parametr umožňuje předání pole argumentů bloku skriptu nakonfigurovanému tak, aby je přijímal.
Poznámka:
Počínaje Windows PowerShell 3.0 lze načítání vlastností a spouštění metod pro každou položku v kolekci provádět také pomocí "Metod skalárních objektů a kolekcí" Více si o tom můžete přečíst zde about_methods
Kde
Umožňuje filtrovat nebo vybrat prvky pole. Skript musí být vyhodnocen jako něco jiného než: nula (0), prázdný řetězec $false nebo $null aby se prvek zobrazil za Where
Pro metodu Where existuje jedna definice.
Where(scriptblock expression[, WhereOperatorSelectionMode mode
[, int numberToReturn]])
Blok Expression skriptu is je vyžadován pro filtrování, mode volitelný argument umožňuje další možnosti výběru a numberToReturn volitelný argument umožňuje omezit počet položek vrácených z filtru.
Poznámka:
Syntaxe vyžaduje použití bloku skriptu. Závorky jsou volitelné.
Následující příklad ukazuje, jak vybrat všechna lichá čísla z pole.
(0..9).Where{ $_ % 2 }
1
3
5
7
9
K dispozici jsou následující režimy výběru.
Výchozí
Režim Default filtruje položky pomocí bloku skriptů Expression .
Pokud je zadáno a numberToReturn , určuje maximální počet položek, které se mají vrátit.
# Get the zip files in the current users profile, sorted by LastAccessTime.
$Zips = dir $env:userprofile -Recurse '*.zip' | Sort-Object LastAccessTime
# Get the least accessed file over 100MB
$Zips.Where({$_.Length -gt 100MB}, 'Default', 1)
Poznámka:
Režim Default i režim First vrátí první (numberToReturn) položky a lze je použít zaměnitelně.
Poslední
$h = (Get-Date).AddHours(-1)
$logs = dir 'C:\' -Recurse '*.log' | Sort-Object CreationTime
# Find the last 5 log files created in the past hour.
$logs.Where({$_.CreationTime -gt $h}, 'Last', 5)
PřeskočitAž
Režim SkipUntil přeskočí všechny objekty v kolekci, dokud objekt nepřejde filtr blokového výrazu skriptu. Poté vrátí VŠECHNY zbývající položky kolekce bez jejich testování.
Testuje se pouze jedna procházející položka
To znamená, že vrácená kolekce bude obsahovat předávající i nepředávající položky, které NEBYLY testovány.
Počet vrácených položek lze omezit předáním hodnoty argumentu numberToReturn .
$computers = "Server01", "Server02", "Server03", "localhost", "Server04"
# Find the first available online server.
$computers.Where({ Test-Connection $_ }, 'SkipUntil', 1)
localhost
Do
Režim Until invertuje SkipUntil režim. Vrátí VŠECHNY položky v kolekci, dokud položka nesplní podmínku výrazu skriptového bloku. Jakmile položka projde výrazem scriptblock, Where metoda zastaví zpracování položek.
To znamená, že z metody obdržíte první sadu Where položek.
Poté, co jedna položka projde, zbytek NEBUDE testován ani vrácen.
Počet vrácených položek lze omezit předáním hodnoty argumentu numberToReturn .
# Retrieve the first set of numbers less than or equal to 10.
(1..50).Where({$_ -gt 10}, 'Until')
# This would perform the same operation.
(1..50).Where({$_ -le 10})
1
2
3
4
5
6
7
8
9
10
Poznámka:
Oba Until a SkipUntil fungují za předpokladu, že NEtestují šarži položek.
Until vrací položky PŘED prvním průchodem.
SkipUntil vrací všechny položky PO prvním průchodu, včetně první procházející položky.
Rozděleno
Režim Split rozdělí nebo seskupí položky kolekce do dvou samostatných kolekcí. Ty, které předají výraz scriptblock, a ty, které ne.
Pokud je zadáno a numberToReturn , první kolekce bude obsahovat předávané položky, které nepřekročí zadanou hodnotu.
Zbývající objekty, dokonce i ty, které projdou filtrem výrazů, budou vráceny ve druhé kolekci.
$running, $stopped = (Get-Service).Where({$_.Status -eq 'Running'}, 'Split')
$running
Status Name DisplayName
------ ---- -----------
Running Appinfo Application Information
Running AudioEndpointBu... Windows Audio Endpoint Builder
Running Audiosrv Windows Audio
...
$stopped
Status Name DisplayName
------ ---- -----------
Stopped AJRouter AllJoyn Router Service
Stopped ALG Application Layer Gateway Service
Stopped AppIDSvc Application Identity
...
Získání členů pole
Chcete-li získat vlastnosti a metody pole, jako je například vlastnost Length a metoda SetValue, použijte parametr InputObject rutiny Get-Member.
Když přesměrujete pole do Get-Member, PowerShell odešle položky jednu po druhé a Get-Member vrátí typ každé položky v poli (ignoruje duplicity).
Při použití parametru Get-Member vrátí členy pole.
Například následující příkaz získá členy $a proměnné pole.
Get-Member -InputObject $a
Členy pole můžete také získat zadáním čárky (,) před hodnotu, která je předána rutině Get-Member. Čárka učiní z pole druhou položku v poli polí. Windows PowerShell předává pole jedno po druhém a Get-Member vrátí členy pole. Stejně jako následující dva příklady.
,$a | Get-Member
,(1,2,3) | Get-Member
Manipulace s polem
Můžete změnit elementy v poli, přidat element do pole a zkombinovat hodnoty ze dvou polí do třetího pole.
Chcete-li změnit hodnotu určitého elementu v poli, určete název pole a index elementu, který chcete změnit, a pak pomocí operátoru přiřazení (=) určete novou hodnotu elementu. Chcete-li například změnit hodnotu druhé položky v poli (pozice indexu $a 1) na 10, napište:
$a[1] = 10
Ke změně hodnoty můžete také použít metodu SetValue pole. Následující příklad změní druhou hodnotu (pozice indexu $a 1) pole na 500:
$a.SetValue(500,1)
Operátor += můžete použít k přidání elementu do pole. Následující příklad ukazuje, jak přidat prvek do $a pole.
$a = @(0..4)
$a += 5
Poznámka:
Když použijete operátor, += PowerShell ve skutečnosti vytvoří nové pole s hodnotami původního pole a přidanou hodnotou. To může způsobit problémy s výkonem, pokud se operace několikrát opakuje nebo je velikost pole příliš velká.
Odstranit prvky z pole není snadné, ale můžete vytvořit nové pole, které obsahuje pouze vybrané prvky existujícího pole. Chcete-li například vytvořit $t pole se všemi prvky v $a poli s výjimkou hodnoty na pozici indexu 2, zadejte:
$t = $a[0,1 + 3..($a.length - 1)]
Chcete-li zkombinovat dvě matice do jedné matice, použijte operátor plus (+). Následující příklad vytvoří dvě pole, zkombinuje je a pak zobrazí výsledné sloučené pole.
$x = 1,3
$y = 5,9
$z = $x + $y
Výsledkem je, že $z pole obsahuje hodnoty 1, 3, 5 a 9.
Chcete-li pole odstranit, přiřaďte mu hodnotu $null. Následující příkaz odstraní pole v proměnné.$a
$a = $null
Můžete také použít rutinu Remove-Item , ale přiřazení hodnoty je $null rychlejší, zejména u velkých polí.
Pole s nulou nebo jednou
Počínaje Windows PowerShell 3.0 má kolekce nulového nebo jednoho objektu vlastnost Počet a Délka. Také můžete indexovat do pole jednoho objektu. Tato funkce vám pomůže vyhnout se chybám skriptování, ke kterým dochází, když příkaz, který očekává kolekci, získá méně než dvě položky.
Následující příklady ukazují tuto funkci.
Nulové objekty
$a = $null
$a.Count
$a.Length
0
0
Jeden objekt
$a = 4
$a.Count
$a.Length
$a[0]
$a[-1]
1
1
4
4