Sdílet prostřednictvím


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-Objectpř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-Objectumožň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

Viz také