Č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.