O polích
Krátký popis
Popisuje pole, což jsou datové struktury navržené pro ukládání kolekcí položek.
Dlouhý popis
Pole je datová struktura, která je navržená tak, aby ukládala kolekci položek. Položky můžou mít stejný typ nebo různé typy.
Počínaje Windows PowerShell 3.0 má kolekce nula nebo jednoho objektu některé vlastnosti polí.
Vytvoření a inicializace pole
Pokud chcete vytvořit a inicializovat pole, přiřaďte proměnné více hodnot. Hodnoty uložené v poli jsou oddělené čárkou a od názvu proměnné jsou odděleny operátorem přiřazení (=).
Pokud například chcete vytvořit matici s názvem $A, která obsahuje sedm číselných hodnot 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 (..). Pokud například chcete vytvořit a inicializovat pole s názvem "$B", které obsahuje hodnoty 5 až 8, zadejte:
$B = 5..8
V důsledku toho $B obsahuje čtyři hodnoty: 5, 6, 7 a 8.
Pokud není zadaný žádný datový typ, PowerShell vytvoří každé pole jako pole objektů (typ: System.Object[]). K určení datového typu pole použijte metodu GetType(). Pokud chcete například určit datový typ pole $a, zadejte:
$a.GetType()
Chcete-li vytvořit pole silného typu, to znamená 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, před názvem proměnné zadejte typ pole uzavřený v hranatých závorkách. Pokud chcete 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 důsledku toho může pole $ia obsahovat pouze celá čísla.
Můžete vytvořit pole, která jsou přetypovaná na libovolný podporovaný typ v rozhraní Microsoft .NET Framework. Například objekty, které Get-Process načítají k reprezentaci procesů, jsou typu System.Diagnostics.Process. Pokud chcete vytvořit pole procesový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í:
@( ... )
Pomocí operátoru pole můžete vytvořit pole s nulovým nebo jedním objektem. Příklad:
PS> $a = @("Hello World")
PS> $a.Count
1
PS> $b = @()
PS> $b.Count
0
Operátor pole je zvlášť užitečný ve skriptech, když získáváte objekty, ale nevíte, kolik objektů získáte. Příklad:
$p = @(Get-Process Notepad)
Další informace o operátoru dílčího výrazu pole najdete v tématu about_Operators.
Přístup k prvkům pole a jejich používání
Čtení pole
Na pole můžete odkazovat pomocí názvu proměnné. Pokud chcete zobrazit všechny prvky v poli, zadejte název pole. Předpokládejme například, že $a
je pole obsahující celá čísla 0, 1, 2, až 9; zadejte:
$a
0
1
2
3
4
5
6
7
8
9
Na prvky v poli můžete odkazovat pomocí indexu začínajícího na pozici 0. Číslo indexu uzavřete do závorek. Pokud chcete například zobrazit první prvek v $a
poli, zadejte:
$a[0]
0
Pokud chcete zobrazit třetí prvek v $a
poli, zadejte:
$a[2]
2
Část pole můžete načíst pomocí operátoru rozsahu pro index. Pokud například chcete načíst druhý až pátý prvek pole, zadejte:
$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, ve vzestupném pořadí indexu zadejte:
$a = 0 .. 9
$a[-3..-1]
7
8
9
Pokud zadáte záporné indexy v sestupném pořadí, výstup se změní.
$a = 0 .. 9
$a[-1..-3]
9
8
7
Při použití tohoto zápisu však buďte opatrní. Notační cykly od koncové hranice do 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. Odkazuje na první, poslední a předposekundové prvky v poli.
Pomocí operátoru plus (+) můžete zkombinovat oblasti se seznamem prvků v matici. Pokud chcete například zobrazit prvky na pozicích indexu 0, 2 a 4 až 6, zadejte:
$a = 0 .. 9
$a[0,2+4..6]
0
2
4
5
6
Pokud chcete zobrazit seznam více oblastí a jednotlivých prvků, můžete použít operátor plus. Pokud chcete například vypsat prvky nula na dva, čtyři až šest a element na osmém pozičním typu:
$a = 0..9
$a[+0..2+4..6+8]
0
1
2
4
5
6
8
Iterace prvků pole
Můžete také použít konstruktory smyčky, jako jsou forEach, For a While smyčky, odkazovat na prvky v poli. Pokud chcete například použít smyčku ForEach k zobrazení prvků 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 matici, 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. Pokud chcete například použít smyčku For k vrácení všech ostatních hodnot v matici, 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 matici, dokud definovaná podmínka přestane platit. Pokud chcete například zobrazit prvky v matici $a
, 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í
Count nebo Length nebo LongLength
Pokud chcete zjistit, kolik položek je v poli, použijte Length
vlastnost nebo její Count
alias. Longlength
je užitečné, pokud matice obsahuje více než 2 147 483 647 prvků.
$a = 0..9
$a.Count
$a.Length
10
10
Rank
Vrátí počet dimenzí v poli. Většina polí v PowerShellu má jenom jednu dimenzi. I když si myslíte, že vytváříte multidimenzionální 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 PowerShellu 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í
Vymazat
Nastaví všechny hodnoty elementu na výchozí hodnotu typu elementu pole. Metoda Clear() neobnovuje 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
ForEach
Umožňuje iterovat všechny 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žívat metodu foreach. V tomto případě je záměrem vygenerovat druhou hodnotu prvků v poli.
Upozorňujeme, že tato metoda byla přidána v PowerShellu v4 a není k dispozici ve verzích pod touto verzí. V předchozích verzích použijte metodu Pipelining k rutině ForEach-Object.
$a = @(0 .. 3)
$a.ForEach({ $_ * $_})
0
1
4
9
Stejně jako -ArgumentList
parametr parametr umožňuje ForEach-Object
předání pole argumentů bloku skriptu nakonfigurovaného tak, arguments
aby je přijímal.
ForEach(typ convertToType)
Metodu ForEach
lze použít k rychlému přetypování elementů na jiný typ. Následující příklad ukazuje, jak převést seznam kalendářních dat řetězce 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(string propertyName)
ForEach(string 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(string methodName)
ForEach(string methodName, object[] argumenty)
ForEach
Nakonec lze metody použít ke spuštění metody pro každou položku v kolekci.
("one", "two", "three").ForEach("ToUpper")
ONE
TWO
THREE
Stejně jako -ArgumentList
parametr parametru ForEach-Object
umožňuje předání pole argumentů do bloku skriptu nakonfigurovaného tak, arguments
aby je přijímal.
Poznámka
Počínaje verzí Windows PowerShell 3.0 lze načtení vlastností a spuštění metod pro každou položku v kolekci provést také pomocí metody "Metody skalárních objektů a kolekcí". Další informace najdete tady about_methods
Kde
Umožňuje filtrovat nebo vybrat prvky pole. Skript se musí vyhodnotit na cokoli jiného než nula (0), prázdný řetězec $false
nebo $null
aby se prvek zobrazil po Where
Pro metodu Where
existuje jedna definice.
Where(scriptblock expression[, WhereOperatorSelectionMode mode
[, int numberToReturn]])
Parametr Expression
je scriptblock, který se vyžaduje 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 filtrem.
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.
Default
Režim Default
filtruje položky pomocí Expression
skriptu scriptblock.
numberToReturn
Pokud je zadaný, 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
Default
Režim i First
režim vrací první (numberToReturn
) položky a dají se zaměnit.
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)
SkipUntil
Režim SkipUntil
přeskočí všechny objekty v kolekci, dokud objekt neprojde filtrem výrazu bloku skriptu. Pak vrátí VŠECHNY zbývající položky kolekce bez jejich testování. Testuje se pouze jedna předávací položka.
To znamená, že vrácená kolekce bude obsahovat předávací i neprocházející položky, které NEBYLY testovány.
Počet vrácených položek může být omezen 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
Dokud
Režim Until
invertuje SkipUntil
režim. Vrátí všechny položky v kolekci, dokud položka nepřejde výrazem bloku skriptu. Jakmile položka předá výraz scriptblock, Where
metoda zastaví zpracování položek.
To znamená, že z metody obdržíte první sadu nepředcházejícíchWhere
položek. Jakmile jedna položka projde, zbytek se NEBUDE testovat ani nevrátí.
Počet vrácených položek může být omezen 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
SkipUntil
A Until
fungují v rámci předpokladu, že NEtestuje dávku položek.
Until
vrátí položky PŘED prvním průchodem.
SkipUntil
vrátí všechny položky PO prvním průchodu, včetně první předávací položky.
Rozdělení
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.
numberToReturn
Pokud je zadaný, první kolekce bude obsahovat předávací položky, aby nepřekročila zadanou hodnotu.
Zbývající objekty, dokonce i ty, které PŘEDAJÍ filtr výrazů, se vrátí 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 length vlastnost a SetValue metoda, použijte inputObject parametr Get-Member rutiny.
Když předáte pole do Get-Member
, PowerShell odesílá položky po jednom a Get-Member
vrací typ každé položky v poli (ignoruje duplicitní položky).
Když použijete parametr -InputObject , 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 získat také zadáním čárky (,) před hodnotu, která je předaná do rutiny Get-Member. Čárka dělá pole druhou položkou v poli polí. Windows PowerShell po jednom předá pole a Get-Member vrátí členy pole. Jako v následujících dvou příkladech.
,$a | Get-Member
,(1,2,3) | Get-Member
Manipulace s polem
Můžete změnit prvky v poli, přidat prvek do pole a zkombinovat hodnoty ze dvou polí do třetí matice.
Chcete-li změnit hodnotu určitého prvku v poli, zadejte název pole a index prvku, který chcete změnit, a pak pomocí operátoru přiřazení (=) zadejte novou hodnotu prvku. Pokud například chcete změnit hodnotu druhé položky v matici (pozice indexu $a
1) na 10, zadejte:
$a[1] = 10
Můžete také použít SetValue metoda pole ke změně hodnoty. Následující příklad změní druhou hodnotu (pozici indexu $a
1) pole na 500:
$a.SetValue(500,1)
Pomocí operátoru += můžete přidat prvek 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 pole příliš velké.
Není snadné odstranit prvky z pole, ale můžete vytvořit nové pole, které obsahuje pouze vybrané prvky existujícího pole. Pokud například chcete 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)]
Pokud chcete zkombinovat dvě pole do jedné matice, použijte operátor plus (+). Následující příklad vytvoří dvě pole, zkombinuje je a zobrazí výslednou kombinovanou matici.
$x = 1,3
$y = 5,9
$z = $x + $y
Výsledkem je, že $z
pole obsahuje hodnoty 1, 3, 5 a 9.
Chcete-li odstranit pole, přiřaďte mu hodnotu $null. Následující příkaz odstraní pole v $a
proměnné .
$a = $null
Můžete také použít rutinu Remove-Item
, ale přiřazení hodnoty $null
je rychlejší, zejména u velkých polí.
Pole nula nebo jedna
Od Windows PowerShell 3.0 má kolekce nula nebo jednoho objektu vlastnost Count a Length. Můžete také 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, dostane 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