Sdílet prostřednictvím


O polích

Krátký popis

Popisuje pole, která jsou datové struktury navržené pro 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é typy.

Počínaje prostředím Windows PowerShell 3,0 kolekce nula nebo jednoho objektu obsahuje 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 čísel (int) hodnoty 22, 5, 10, 8, 12, 9 a 80, zadejte:

$A = 22,5,10,8,12,9,80

Můžete také vytvořit a inicializovat pole pomocí operátoru Range (..). Chcete-li například vytvořit a inicializovat pole s názvem "$B", které obsahuje hodnoty 5 až 8, zadejte:

$B = 5..8

V důsledku toho $B obsahovat čtyři hodnoty: 5, 6, 7 a 8.

Pokud není zadán žádný datový typ, PowerShell vytvoří každé pole jako pole objektu (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 silného typu, tj. pole, které může obsahovat pouze hodnoty konkrétního typu, přetypovat proměnnou jako typ pole, například String [], Long [] nebo Int32 []. Chcete-li přetypovat pole, před název proměnné uveďte typ pole uzavřený v závorkách. Chcete-li například vytvořit 32 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 pole $ia může obsahovat pouze celá čísla.

Můžete vytvořit pole, která jsou převedena na libovolný podporovaný typ v Microsoft .NET Framework. Například objekty, které GET-Process načte k reprezentování procesů, jsou typu System. Diagnostics. Process. Chcete-li vytvořit pole silně typovaného objektu procesu, 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, a to i v případě, že obsahuje nula nebo jeden objekt.

Syntaxe operátoru pole je následující:

@( ... )

Operátor pole lze použít k vytvoření pole nula nebo jeden objekt. Příklad:

PS> $a = @("Hello World")
PS> $a.Count
1
PS> $b = @()
PS> $b.Count
0

Operátor Array je zvláště užitečný ve skriptech, když získáváte objekty, ale nevíte, kolik objektů se vám bude zobrazovat. Příklad:

$p = @(Get-Process Notepad)

Další informace o operátoru dílčího výrazu pole naleznete v tématu about_Operators.

Přístup k prvkům pole a jejich používání

Čtení pole

Můžete odkazovat na pole pomocí jeho názvu proměnné. Chcete-li zobrazit všechny prvky v poli, zadejte název pole. Předpokládejme například, $a že je pole obsahující celá čísla 0, 1, 2, do 9; psaní:

$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 uveďte v závorkách. Například pro zobrazení prvního prvku v $a poli 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ý k pátému prvku pole, zadejte:

$a[1..4]
1
2
3
4

Počet záporných čísel od konce pole Například "-1" odkazuje na poslední prvek pole. Chcete-li zobrazit poslední tři prvky pole, v indexu vzestupném pořadí 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

Buďte ale opatrní při použití tohoto zápisu. Notace cyklů od hranice konce až po začátek pole.

$a = 0 .. 9
$a[2..-2]
2
1
0
9
8

Jedna běžná chyba má také za to, že předpokládá $a[0..-2] všechny prvky pole, s výjimkou posledního z nich. Odkazuje na první, poslední a druhé prvky v poli.

Pomocí operátoru plus (+) lze kombinovat rozsahy se seznamem prvků v poli. Chcete-li například zobrazit prvky na pozici indexu 0, 2 a 4 až 6, zadejte:

$a = 0 .. 9
$a[0,2+4..6]
0
2
4
5
6

K vypsání více rozsahů a jednotlivých prvků můžete také použít operátor Plus. Například pro vypsání prvků nula až dvou, čtyři až šest a element na osmá pozici typu:

$a = 0..9
$a[+0..2+4..6+8]
0
1
2
4
5
6
8

Iterace nad prvky pole

K odkazování na prvky v poli můžete použít také konstrukce smyček, jako je například ForEach, for a while. Například pro použití smyčky 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í pole a vrátí každou hodnotu v poli, dokud nedosáhne konce pole.

Smyčka for je užitečná, když přidáváte čítače při prohlížení prvků v poli. Například pokud chcete pomocí smyčky for vracet každou jinou hodnotu v poli, zadejte:

$a = 0..9
for ($i = 0; $i -le ($a.length - 1); $i += 2) {
  $a[$i]
}
0
2
4
6
8

Cyklus while lze použít k zobrazení prvků v poli, dokud není definovaná podmínka nadále pravdivá. Například chcete-li zobrazit prvky v $a poli, zatímco 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 LongLength

Chcete-li určit, kolik položek je v poli, použijte Length vlastnost nebo její Count alias. Longlengthje užitečné, pokud pole obsahuje více než 2 147 483 647 prvků.

$a = 0..9
$a.Count
$a.Length
10
10

Rank

Vrátí počet rozměrů v poli. Většina polí v PowerShellu má jenom jednu dimenzi. I když si myslíte, že vytváříte multidimenzionální pole; Podobně 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

Sestavení skutečně multidimenzionálního pole v PowerShellu vyžaduje pomoc rozhraní .NET Framework. Podobně jako v následujícím příkladu:

[int[,]]$rank2 = [int[,]]::new(5,5)
$rank2.rank
2

Metody polí

Vymazat

Nastaví všechny hodnoty prvků na výchozí hodnotu typu elementu pole. Metoda Clear () neresetuje 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 $intA je explicitně zadáno, aby obsahovalo celá čísla.

[int[]] $intA = 1, 2, 3
$intA.Clear()
$intA
0
0
0

ForEach

Umožňuje iterovat všechny prvky v poli a provádět 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 objektu [])

Poznámka

Syntaxe vyžaduje použití bloku skriptu. Závorky jsou nepovinné.

Následující příklad ukazuje, jak použít metodu foreach. V tomto případě záměrem je vygenerovat čtvercovou hodnotu prvků v poli.

Všimněte si prosím, že se tato metoda přidala do prostředí PowerShell v4 a není dostupná ve verzích uvedených dál. Pro předchozí verze prosím použijte metodu přesměrování pro rutinu ForEach-Object.

$a = @(0 .. 3)
$a.ForEach({ $_ * $_})
0
1
4
9

Stejně jako -ArgumentList parametr ForEach-Object , arguments parametr umožňuje předání pole argumentů bloku skriptu nakonfigurovanému pro jejich přijetí.

ForEach (typ convertToType)

ForEachMetoda může být použita k rychlému přetypování prvků na jiný typ; následující příklad ukazuje, jak převést seznam kalendářní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 (řetězec propertyName)

ForEach (řetězec propertyName, Object [] newValue)

ForEachMetodu 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; argumenty objektu [])

Nakonec ForEach 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 ForEach-Object , arguments parametr umožňuje předání pole argumentů bloku skriptu nakonfigurovanému pro jejich přijetí.

Poznámka

Od Windows PowerShellu 3,0 načítání vlastností a spouštění metod pro každou položku v kolekci se dá také udělat pomocí metod 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 jinou hodnotu než: nula (0), prázdný řetězec $false nebo $null pro element, který se má zobrazit zaWhere

Pro metodu existuje jedna definice Where .

Where(scriptblock expression[, WhereOperatorSelectionMode mode
                            [, int numberToReturn]])

ExpressionJe ScriptBlock, který 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 nepovinné.

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í

DefaultRežim filtruje položky pomocí Expression ScriptBlock.

Pokud numberToReturn je k dispozici, 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

DefaultRežim i režim First vrací první ( numberToReturn ) položku 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)

SkipUntil

SkipUntilRežim přeskočí všechny objekty v kolekci, dokud objekt nepředá filtr výrazu bloku skriptu. Pak vrátí všechny zbývající položky kolekce bez jejich testování. Testuje se jenom jedna položka předávání.

To znamená, že vrácená kolekce bude obsahovat průchozí i neprůchozí položky, které nebyly testovány.

Počet vrácených položek může být omezen předáním hodnoty do numberToReturn argumentu.

$computers = "Server01", "Server02", "Server03", "localhost", "Server04"
# Find the first available online server.
$computers.Where({ Test-Connection $_ }, 'SkipUntil', 1)
localhost

Vrátí

UntilRežim obrátí SkipUntil režim. Vrátí všechny položky v kolekci, dokud položka nepředá výraz bloku skriptu. Jakmile položka předá výraz ScriptBlock, Where Metoda zastaví zpracování položek.

To znamená, že obdržíte první sadu nepředávání položek z Where metody. Po předávání jedné položky nebude zbytek testován ani vrácen.

Počet vrácených položek může být omezen předáním hodnoty do numberToReturn argumentu.

# 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

UntilA SkipUntil pracují s místními testy, které netestuje dávku položek.

Untilvrátí položky před prvním průchodem.

SkipUntilVrátí všechny položky po prvním průchodu, včetně prvního předání položky.

Rozdělení

SplitRežim rozdělí nebo seskupí položky kolekce do dvou samostatných kolekcí. Ty, které předaly výraz ScriptBlock, a ty, které ne.

Je-li numberToReturn zadán, první kolekce bude obsahovat předávání položek, nikoli přesáhnout zadanou hodnotu.

Zbývající objekty, i ty, které předaly filtr výrazů, budou vráceny do druhé kolekce.

$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 položky InputObject rutiny get-member.

Při přesměrování pole do kanálu Get-Member odešle PowerShell položky po jednom a Get-Member vrátí typ každé položky v poli (ignorování duplicitních hodnot).

Při použití parametru -položky 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 lze také získat zadáním čárky (,) před hodnotou, která je přepsána do přesměrovaného do rutiny get-member. Čárka vytvoří z pole druhou položku v poli polí. Prostředí Windows PowerShell rozřadí pole po jednom a vrátí člena, který vrací členy tohoto pole. Podobně 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 kombinovat hodnoty ze dvou polí do třetího pole.

Chcete-li změnit hodnotu konkrétního prvku v poli, zadejte název pole a index prvku, který chcete změnit, a poté použijte operátor přiřazení (=) k určení nové hodnoty prvku. Chcete-li například změnit hodnotu druhé položky v $a poli (index pozice 1) na hodnotu 10, zadejte:

$a[1] = 10

Můžete také použít metodu SetValue pole pro změnu hodnoty. V následujícím příkladu se změní druhá hodnota (index pozice 1) $a 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řidané hodnoty. To může způsobit problémy s výkonem, pokud se operace opakuje několikrát nebo je velikost pole příliš velká.

Nelze snadno odstranit prvky z pole, 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 jednoho pole, použijte operátor plus (+). Následující příklad vytvoří dvě pole, zkombinuje je a pak zobrazí výsledné kombinované pole.

$x = 1,3
$y = 5,9
$z = $x + $y

V důsledku toho $z pole obsahuje 1, 3, 5 a 9.

Chcete-li odstranit pole, přiřaďte poli hodnotu $null. Následující příkaz odstraní pole v $a proměnné.

$a = $null

Můžete také použít Remove-Item rutinu, ale přiřadíte hodnotu $null rychlejší, zejména pro velká pole.

Pole nula nebo jedna

Počínaje prostředím Windows PowerShell 3,0 má kolekce nula nebo jeden objekt vlastnost Count a length. Také je možné indexovat do pole jednoho objektu. Tato funkce pomáhá předejít 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.

Tuto funkci ukazují následující příklady.

Nula objektů

$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é