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
Čárku lze také použít k inicializaci pole s jednou položkou umístěním čárky před jednu položku.
Chcete-li například vytvořit pole s názvem $B jedné položky obsahující jedinou hodnotu 7, zadejte:
$B = ,7
Pole můžete také vytvořit a inicializovat pomocí operátoru rozsahu (..).
Následující příklad vytvoří pole obsahující hodnoty 5 až 8.
$C = 5..8
Výsledkem je, že obsahuje čtyři hodnoty: $C 5, 6, 7 a 8.
Pokud není zadán žádný datový typ, PowerShell vytvoří každé pole jako pole objektů (System.Object[]). Chcete-li určit datový typ pole, použijte metodu GetType(). Chcete-li například určit datový typ $A pole, zadejte:
$A.GetType()
Chcete-li vytvořit pole silného typu, 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 $ia pole může obsahovat pouze celá čísla.
Můžete vytvořit pole, která jsou přetypována na libovolný podporovaný typ v rozhraní .NET. Například objekty, které se načítají, Get-Process 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 z příkazů v něm obsažených. Cokoli příkaz uvnitř operátoru vytvoří, operátor to umístí do pole. I když existuje 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:
$a = @("Hello World")
$a.Count
1
$b = @()
$b.Count
0
Operátor pole je užitečný 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, například ForEach, Fora While cykly, k odkazování na prvky v poli. Chcete-li 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 prochází matici a vrací každou hodnotu v matici, dokud nedosáhne konce pole.
Smyčka For je užitečná, když zvyšujete čítače 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 není definovaná podmínka pravdivá. 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í
Count nebo Length nebo LongLength
Chcete-li zjistit, kolik položek je v poli, použijte vlastnost Length nebo její Count alias. Funkce 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
Rank
Vrací počet rozměrů v poli. Většina polí v PowerShellu má pouze 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)
)
"`$a rank: $($a.Rank)"
"`$a length: $($a.Length)"
"`$a[2] length: $($a[2].Length)"
"Process `$a[2][1]: $($a[2][1].ProcessName)"
V tomto příkladu vytváříte jednorozměrné pole, které obsahuje další pole. To je také známé jako zubaté pole. Vlastnost Rank prokázala, že se jedná o jednorozměrné. Chcete-li získat přístup k položkám v zubatém poli, musí být indexy v samostatných závorkách ([]).
$a rank: 1
$a length: 3
$a[2] length: 348
Process $a[2][1]: AcroRd32
Multidimenzionální pole jsou uložena v pořadí podle hlavních řádků. Následující příklad ukazuje, jak vytvořit skutečně multidimenzionální pole.
[string[,]]$rank2 = [string[,]]::New(3,2)
$rank2.rank
$rank2.Length
$rank2[0,0] = 'a'
$rank2[0,1] = 'b'
$rank2[1,0] = 'c'
$rank2[1,1] = 'd'
$rank2[2,0] = 'e'
$rank2[2,1] = 'f'
$rank2[1,1]
2
6
d
Chcete-li získat přístup k položkám v multidimenzionálním poli, oddělte indexy čárkou (,) v jedné sadě závorek ([]).
Některé operace s multidimenzionálním polem, jako je replikace a zřetězení, vyžadují, aby bylo toto pole zploštěno. Sloučení změní pole na 1-rozměrné pole neomezeného typu. Výsledné pole přebírá všechny prvky v řádkovém pořadí. Podívejte se na následující příklad:
$a = "red",$true
$b = (New-Object 'int[,]' 2,2)
$b[0,0] = 10
$b[0,1] = 20
$b[1,0] = 30
$b[1,1] = 40
$c = $a + $b
$a.GetType().Name
$b.GetType().Name
$c.GetType().Name
$c
Výstup ukazuje, že $c se jedná o 1-rozměrné pole obsahující položky z $a a $b v pořadí podle hlavních řádků.
Object[]
Int32[,]
Object[]
red
True
10
20
30
40
Metody polí
Clear
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
ForEach
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(scriptblock expression, object[] arguments)
ForEach(type convertToType)
ForEach(string propertyName)
ForEach(string propertyName, object[] newValue)
ForEach(string methodName)
ForEach(string methodName, object[] arguments)
ForEach(výraz scriptblock)
ForEach(výraz scriptblock, argumenty object[])
Tato metoda byla přidána v PowerShellu v4.
Poznámka:
Syntaxe vyžaduje použití bloku skriptu. Závorky jsou volitelné, pokud je blok skriptu jediným parametrem. Také nesmí být mezera mezi metodou a levou závorkou nebo složenou závorkou.
Následující příklad ukazuje, jak metodu ForEach použít. V tomto případě je záměrem vygenerovat čtvercovou hodnotu prvků v poli.
$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.
Další informace o chování ArgumentListnajdete v části about_Splatting.
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 methodName ř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 hodnot do bloku skriptu nakonfigurovaného 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 Další informace o booleovském vyhodnocení najdete v části about_Booleans.
Pro metodu Where existuje jedna definice.
Where(scriptblock expression[, WhereOperatorSelectionMode mode
[, int numberToReturn]])
Poznámka:
Syntaxe vyžaduje použití bloku skriptu. Závorky jsou volitelné, pokud je blok skriptu jediným parametrem. Také nesmí být mezera mezi metodou a levou závorkou nebo složenou závorkou.
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.
Přijatelné hodnoty pro mode jsou:
- Default (0) - Vrátit všechny položky
- First (1) - Vraťte první položku
- Last (2) - Vrácení poslední položky
- SkipUntil (3) - Přeskočit položky, dokud není podmínka pravdivá, vrátit všechny zbývající položky (včetně první položky, pro kterou je podmínka pravdivá)
- Until (4) - Vraťte všechny položky, dokud není podmínka splněna
-
Split (5) - Vrátí pole dvou prvků
- První prvek obsahuje odpovídající položky.
- Druhý prvek obsahuje zbývající položky
Následující příklad ukazuje, jak vybrat všechna lichá čísla z pole.
(0..9).Where{ $_ % 2 }
1
3
5
7
9
Tento příklad ukazuje, jak vybrat řetězce, které nejsou prázdné.
('hi', '', 'there').Where({$_.Length})
hi
there
Default
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ě.
Last
$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 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 obsahuje předávané i neprocházejí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
Until
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 obdržíte první sadu neprošlých položek z metody Where.
Poté , co jedna položka projde, ostatní NEJSOU testovány ani vráceny.
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.
Split
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án numberToReturn, první kolekce obsahuje zahrnující položek, aniž by překročila zadanou hodnotu.
Zbývající objekty, dokonce i ty, které projdou filtrem výrazů, jsou 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
...
Poznámka:
Obě foreach metody a where jsou vnitřními členy. Další informace o vnitřních členech naleznete v tématu about_Instrinsic_Members
Získání členů pole
Chcete-li získat vlastnosti a metody pole, jako Length je vlastnost 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 získat také 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í. PowerShell předává pole jedno po druhém a Get-Member vrací č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ě pole 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 vlastnosti Count a Length . 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
Podpora indexování pro systém.Tuple objekty
PowerShell 6.1 přidal podporu indexovaného přístupu Tuple k objektům, podobně jako u polí. Například:
PS> $tuple = [Tuple]::Create(1, 'test')
PS> $tuple[0]
1
PS> $tuple[1]
test
PS> $tuple[0..1]
1
test
PS> $tuple[-1]
test
Na rozdíl od polí a jiných objektů kolekce se s objekty zachází jako s jedním objektem, Tuple když jsou předány kanálem nebo parametry, které podporují pole objektů.
Více informací naleznete v tématu Systém.Tuple.
Výčet přístupu členů
Počínaje PowerShellem 3.0 platí, že když použijete operátor přístupu členů pro přístup ke členovi, který neexistuje v kolekci seznamu, PowerShell automaticky vytvoří výčet položek v kolekci a pokusí se o přístup k zadanému členovi u každé položky. Další informace najdete v tématu about_Member-Access_Enumeration.
Příklady
Následující příklad vytvoří dva nové soubory a výsledné objekty uloží do proměnné $filespole. Vzhledem k tomu, že objekt pole nemá člena LastWriteTime , je hodnota LastWriteTime vrácena pro každou položku v poli.
$files = (New-Item -Type File -Force '/temp/t1.txt'),
(New-Item -Force -Type File '/temp/t2.txt')
$files.LastWriteTime
Friday, June 25, 2021 1:21:17 PM
Friday, June 25, 2021 1:21:17 PM
Výčet s přístupem členů umožňuje získat hodnoty z položek v kolekci, ale ne nastavit hodnoty pro položky v kolekci. Například:
$files.LastWriteTime = (Get-Date).AddDays(-1)
InvalidOperation: The property 'LastWriteTime' cannot be found on this object.
Verify that the property exists and can be set.
Chcete-li nastavit hodnoty, musíte použít metodu.
$files.set_LastWriteTime((Get-Date).AddDays(-1))
$files.LastWriteTime
Thursday, June 24, 2021 1:23:30 PM
Thursday, June 24, 2021 1:23:30 PM
Metoda set_LastWriteTime() je skrytým členem objektu FileInfo . Následující příklad ukazuje, jak najít členy, které mají skrytouset metodu.
$files | Get-Member | Where-Object Definition -like '*set;*'
TypeName: System.IO.FileInfo
Name MemberType Definition
---- ---------- ----------
Attributes Property System.IO.FileAttributes Attributes {get;set;}
CreationTime Property datetime CreationTime {get;set;}
CreationTimeUtc Property datetime CreationTimeUtc {get;set;}
IsReadOnly Property bool IsReadOnly {get;set;}
LastAccessTime Property datetime LastAccessTime {get;set;}
LastAccessTimeUtc Property datetime LastAccessTimeUtc {get;set;}
LastWriteTime Property datetime LastWriteTime {get;set;}
LastWriteTimeUtc Property datetime LastWriteTimeUtc {get;set;}
Upozornění
Vzhledem k tomu, že metoda je prováděna pro každou položku v kolekci, je třeba věnovat pozornost volání metod pomocí výčtu členů.