Často při psaní PowerShell skripty, budete potřebovat způsob, jak uložit sadu položek. Jedním z běžných způsobů, jak toho dosáhnout, je pole nebo specifický typ známý jako ArrayList. Ale co je vlastně pole? Pole je datová struktura, která je navržena tak, aby ukládala sbírku položek. To může zahrnovat stejné i různé typy položek.

pole se používají v mnoha různých programovacích jazycích a PowerShell se neliší. Existuje mnoho způsobů, jak vytvářet, manipulovat a optimalizovat pole., V tomto článku se dozvíte o ArrayLists, pole, a sbírky, stejně jako některé osvědčené postupy při jejich použití s PowerShell.

Obsah

Předpoklady/Požadavky

Vzhledem k tomu, budete jen pracovat s PowerShell jazyk sám, nejsou tam žádné ekologické předpoklady. Stačí mít počítač se systémem Windows s PowerShell. Konkrétně:

  • Windows PowerShell 3 nebo novější
  • .NET Framework 4.5 nebo novější

Chcete další tipy, jako je tento?, Podívejte se na můj osobní PowerShell blog na: https://nkasco.com/FriendsOfATA

Vytváření Pole s PowerShell

Existuje mnoho různých způsobů, jak vytvořit pole s PowerShell. Předpokládejme, že máte seznam jmen, které musíte nějak zpracovat, jak je uvedeno níže.

JohnSusieJimJohnnyCarrie

Stavební Polí prostřednictvím Oddělených Čárkami Prvky

nejvíce základní způsob, jak můžete vytvořit pole, je jednoduše přiřadit známé vstupy, odděleny čárkou, do proměnné, jak je uvedeno níže.,

$BasicArray = "John", "Susie", "Jim", "Johnny", "Carrie"

Pokud spustíte GetType() metoda k dispozici pro všechny objekty v prostředí PowerShell, uvidíte, že jste úspěšně vytvořili pole, jak je naznačeno BaseType majetek je uvedeno níže.

PS51> $BasicArray.GetType()IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object System.Array

pomocí Sub-expresního operátora

můžete také vytvářet pole v PowerShellu prostřednictvím sub-expresního operátora. Tento koncept se běžně používá, když nevíte, kolik položek bude přidáno do vašeho pole. Výsledek může obsahovat nulu nebo mnoho položek při vytvoření.,

oznámení pod pole s názvem $MyArray byl vytvořen s nulovými prvky uvnitř.

#Create an empty array with the sub-expression operatorPS51> $MyArray = @()PS51> $MyArray.count0

Použití Rozsah Provozovatel

Pole nejsou jen odsunuta na ukládání řetězců, jak je uvedeno výše. Můžete také vytvářet pole s jinými typy objektů, jako jsou celá čísla.

Pokud potřebujete pole celých čísel v sekvenčním pořadí,můžete vzít zástupce a použít rozsah operátor. Níže vidíte, že pole bylo vytvořeno s celými čísly 2 až 5 s jediným řádkem kódu.,

PS51> $NumberedArray = 2..5PS51> $NumberedArray2345

Vytváření PowerShell Kolekce ArrayList

Pomocí PowerShell ArrayList je také způsob, ve kterém můžete uložit seznam položek s PowerShell. Třída ArrayList je součástí systému.Kolekce jmenný prostor v rámci. NET. vytvořením nového objektu tohoto typu pak můžete ukládat objekty v rámci ArrayList.

Níže můžete vidět, že je nutné explicitně vytvořit objekt ArrayList pomocí New-Object cmdlet nebo litím standardní pole ArrayList objekt.,

Všimněte si, že v tomto případě jeBaseType objekt, zatímco výše uvedené příklady mají základní typy polí, které vykazují dědičnost z třídy objektů. Nakonec PowerShell poskytuje přístup k systému typu. Net.

Přidání položek do pole

při vytváření pole můžete buď definovat všechny prvky v době vytvoření, nebo je přidat ad-hoc.

přidat prvky do existující kolekce, můžete použít += provozovatel nebo Add metoda. Ale vězte, že existují velké rozdíly v tom, jak fungují.,

Když vytvoříte standardní pole s @(), budete používat += operátora, ale přidat prvky ArrayList, měli byste použít Add metoda. Tyto metody se liší tím, že operátor+= skutečně zničí existující pole a vytvoří nové s novou položkou.

prokázat, uvidíte níže můžete odkazovat na IsFixedSize vlastnost pro pole nebo ArrayList vědět, která je neměnná a která není.,

PS51> $BasicArray.IsFixedSizeTruePS51> $MyArrayList.IsFixedSizeFalse

protože základní pole je sbírka pevné velikosti, nemůžete ji upravit.

Pokus o použití metodyAdd() s pole, které je pevná velikost bude mít za následek chybu v důsledku pevné velikosti. Níže naleznete několik příkladů, ve kterých můžete úspěšně přidat položky do pole.

#Does NOT work$BasicArray.Add("Nate")#Works$BasicArray += "Nate"$MyArrayList.Add("Nate")$MyArrayList += "Nate"

Odstranění Položky Z Pole

Nyní, když máte lepší představu o tom, jak přidat položky do pole, pojďme se na několik způsobů, jak můžete odstranit položky z pole.,

protože je základní pole pevné, nemůžete z nich odebrat položky. Místo toho musíte vytvořit zcela nové pole. Můžete například odstranit jeden prvek z pole vytvořením podmíněného příkazu, který odpovídá pouze těm prvkům, které chcete zahrnout. Příklad je uveden níže.

$NewBasicArray = $BasicArray -ne "Nate"

protože ArrayList není pevný,můžete z nich odstranit prvky pomocí metody Remove(). To je jeden scénář, ve kterém pomocí ArrayList může mít prospěch, pokud máte v plánu být často přidávání/odebírání položek.,

$MyArrayList.Remove("Nate")

Načítání Určité Položky Z Pole nebo ArrayList

Chcete-li načíst konkrétní položky z pole nebo ArrayList, můžete použít mnoho různých metod. Stejně jako ostatní objekty v PowerShell, můžete přistupovat ke všem prvkům pole jednoduše voláním objektu.

PS51> $BasicArrayJohnSusieJimJohnnyCarrie

Možná budete muset načíst pouze první prvek, pole bude mít vždy původ z 0 představující první prvek pole. Chcete-li načíst první prvek pole, zadejte číslo indexu v závorkách, jak je uvedeno níže.,

PS51> $BasicArrayJohn

Naopak, můžete také odkazovat indexy dozadu pomocí dash (negativní indikátor) volat poslední číslo X prvků z pole. Běžným způsobem, jak najít poslední prvek v poli, je použití -1, jak je uvedeno níže.

PS51> $BasicArrayCarrie

operátor rozsahu, o kterém jste se dozvěděli výše, lze také použít k načtení objektů pole stejným způsobem volání prvků. Řekněme, že chcete načíst první čtyři jména v poli$BasicArray.,

níže můžete určit rozsah indexů 0-3, které vrátí první čtyři prvky.

PS51> $BasicArrayJohnSusieJimJohnny

Optimalizace Pole s PowerShell

Nyní, když máte dobrý základ, jak vytvořit a manipulovat pole, který z nich byste měli používat? Abychom na to odpověděli, projdeme několik příkladů sMeasure-Command cmdlet. Pomocí Measure-Command rutiny, budete lépe pochopit, jak dlouho příkazy jsou při procesu prvky, jako jsou předány dolů potrubí.,

obecně řečeno, pokud máte malou sbírku objektů, pravděpodobně si nevšimnete velkého rozdílu s tím, jak manipulujete s poli. Pokud však máte velkou sbírku objektů, je důležité pochopit rozdíly, abyste dosáhli optimálních výsledků.

zkusme použít, co jste se naučili v předchozí části o rozdíl mezi += a pomocí Add() metoda s poutkem 50 000 položek.

nejprve vytvořte prázdné pole a prázdný ArrayList, jak je uvedeno níže.,

PS51> $MyArray = @()PS51> $MyArrayList = @()

dále vyplňte 50 000 prvků v každé kolekci pomocí operátoru rozsahu a smyčky foreach, jak je uvedeno níže.

@(0..50000).foreach({$MyArray += $_})@(0..50000).foreach({$MyArrayList.Add($_)})

nakonec zabalte příkazy do výrazu a předejte tento výraz Measure-Command cmdlet. Provedením výrazu s Measure-Command můžete vidět, jak dlouho každý proces skutečně trvá.

Mějte na paměti, že, jak jste se naučili předtím, += vlastně vytváří nové pole, spíše než připojení k pevné.,

výsledek? Téměř 60 sekund proti 139 milisekundám!

jak můžete vidět, je mnohem rychlejší využít ArrayList pro velké sbírky, spíše než pomocí pole pevné velikosti.

i když se jedná o základní příklad, zdůrazňuje důležitost pochopení toho, co váš kód dělá během zpracování. Pokud není správně pochopeno, může to mít za následek špatnou uživatelskou zkušenost.,

Pokud máte nějaké existující skript, který by mohly mít prospěch z používání ArrayList spíše než pole, to by dárek fantastická příležitost, aby se přes noc zlepšení!

Další Čtení

  • Porovnávání pole s PowerShell
  • Jak Vytvořit Pole pro Výkon v PowerShell (MCPmag)

Chcete další tipy, jako je tento? Podívejte se na můj osobní blog PowerShell na adrese: https://nkasco.com/FriendsOfATA.