Pole jsou základním jazykovým rysem většiny programovacích jazyků. Jsou sbírkou hodnot nebo objektů, a proto je obtížné se jim vyhnout. Podívejme se blíže na pole a vše, co mohou nabídnout.

  • index stránky
  • co je pole?,zápas
  • $null nebo prázdný
    • eq
  • Přidávání do pole
    • Pole přírůstek
    • Navíc se rovná +=
    • Potrubí úkol
  • Typy Array
    • Důrazně typované pole
    • ArrayList
    • Obecný Seznam
      • Seznamu
      • Remove()
    • Více sbírek
  • Další nuance
    • Pre-velikosti polí
    • Násobení polí
    • Inicializovat s 0
    • Vnořených polí
    • Napsat-Výstup-NoEnumerate
      • Vrátí pole
  • ještě Něco jiného?,
  • co je to pole?

    začnu se základním technickým popisem toho, jaká pole jsou a jak jsou používána většinou programovacích jazyků, než se přesunu do jiných způsobů, jak je PowerShell využívá.

    pole je datová struktura, která slouží jako sbírka více položek. Můžete iterovat přes pole nebo přistupovat k jednotlivým položkám pomocí indexu. Pole je vytvořeno jako sekvenční část paměti, kde je každá hodnota uložena hned vedle druhé.

    dotknu se každého z těchto detailů, jak jdeme.,

    základní použití

    protože pole jsou tak základní vlastností PowerShell, existuje jednoduchá syntaxe pro práci s nimi v PowerShellu.

    Vytvořit pole s @()

    prázdné pole mohou být vytvořeny pomocí @()

     PS> $data = @() PS> $data.count 0

    můžeme vytvořit pole a semen s hodnotami jen tím, že umístí je v @() závorky.

     PS> $data = @('Zero','One','Two','Three') PS> $data.count 4 PS> $data Zero One Two Three

    toto pole má 4 položky. Když voláme proměnnou $data, vidíme seznam našich položek., Pokud se jedná o řadu řetězců, budeme mít jeden řádek na řetězec.

    můžeme deklarovat pole na více řádcích. Čárka je v tomto případě volitelná a obecně vynechána.

     $data = @( 'Zero' 'One' 'Two' 'Three' )

    já raději prohlašuji, že moje pole na více řádků, jako že. Nejen, že je snazší číst, když máte více položek, ale také usnadňuje porovnání s předchozími verzemi při použití zdrojového ovládání.,

    Jiná syntaxe

    běžně se rozumí, že@() je syntaxe pro vytvoření pole, ale seznamy oddělené čárkami fungují většinu času.

     $data = 'Zero','One','Two','Three'

    Napsat-Výstup k vytvoření pole

    Jeden super trik stojí za zmínku, je, že můžete použít Write-Output rychle vytvářet řetězce na konzole.

     $data = Write-Output Zero One Two Three

    Toto je užitečné, protože nemusíte dát uvozovky kolem řetězce, kdy parametr přijímá řetězce., Nikdy bych to neudělal ve scénáři, ale v konzoli je to spravedlivá hra.

    přístup k položkám

    nyní, když máte pole s položkami v něm, možná budete chtít tyto položky přistupovat a aktualizovat.

    Offset

    pro přístup k jednotlivým položkám používáme závorky s ofsetovou hodnotou začínající na 0. To je, jak jsme se první položka v našem poli:

     PS> $data = 'Zero','One','Two','Three' PS> $data Zero

    důvod, proč jsme použít žádné tady je, že první položka je na začátku seznamu, takže používáme ofsetový 0 položek se k ní dostat., Abychom se dostali k druhé položce, museli bychom pro přeskočení první položky použít offset 1.

     PS> $data One

    to by znamenalo, že poslední položka je v offsetu 3.

     PS> $data Three

    Index

    Nyní můžete vidět, proč jsem si vybral hodnoty, které jsem udělal pro tento příklad. Představil jsem to jako posun, protože to je to, co ve skutečnosti je, ale tento posun je častěji označován jako index. Index, který začíná na 0. Pro zbytek tohoto článku budu volat ofset index.,

    Speciální index triky

    Ve většině jazyků, můžete zadat pouze jedno číslo jako index a budete mít jednu položku zpět. PowerShell je mnohem flexibilnější. Můžete použít více indexů najednou. Poskytnutím seznamu indexů můžeme vybrat několik položek.

     PS> $data Zero Two Three

    položky budou vráceny na základě pořadí indexů za předpokladu,. Pokud duplikujete index, dostanete tuto položku v obou případech.,

     PS> $data Three Zero Three

    můžeme zadat posloupnost čísel s postavena v .. operátor.

     PS> $data One Two Three

    to funguje i obráceně.

     PS> $data Three Two One

    můžete použít negitive index hodnoty kompenzovat od konce. Takže pokud potřebujete poslední položku v seznamu, můžete použít -1.,

     PS> $data Three

    zakázán

    Ve většině jazyků, pokud se pokusíte přístup index položky, která je za konec pole, dostali byste nějaké chyby nebo výjimky. PowerShell vám tiše nedá nic.

     PS> $null -eq $data True

    Nemůže index do pole null

    Pokud vaše proměnná je $null a ty se snaží indexovat jako pole, budete mít System.Management.Automation.RuntimeException s výjimkou zpráva Cannot index into a null array.,

     PS> $empty = $null SP> $empty Error: Cannot index into a null array.

    ujistěte se, že vaše pole nejsou $null předtím, než se pokusíte přístup k prvkům uvnitř nich.

    Count

    pole a další sbírky mají vlastnost count, která vám řekne, kolik položek je v poli.

     PS> $data.count 4

    PowerShell 3.0 přidal vlastnost Počet pro většinu objektů. můžete mít jeden objekt a měl by vám dát počet 1.,

     PS> $date = Get-Date PS> $date.count 1

    I $null má počítat nemovitosti až na to, že se vrací 0.

     PS> $null.count 0

    Tam jsou některé pasti tady, že jsem se znovu, když jsem kryt kontrolu $null nebo prázdné pole později v tomto článku.

    Vypnuto o jednu chybu

    vytvoří se společná programovací chyba, protože pole začínají na indexu 0. Vypnuto jednou chybou může být zavedeno dvěma velmi běžnými způsoby.,

    první je psychicky myšlení chcete 2. položku a pomocí indexu 2 a opravdu se třetím bodem. Nebo tím myslel, že máte 4 položky a chcete poslední položky, takže budete stačí použít velikost pro přístup na poslední položku.

     $data

    PowerShell je dokonale šťastný, aby vám to udělat, a dá vám přesně to, co položka existuje na index 4, $null. Měli byste používat $data.count - 1 nebo -1 o kterých jsme se dozvěděli výše.,

     PS> $data Three

    zde můžete použít-1 index pro získání posledního prvku.

     PS> $data Three

    značka Lee Dailey také poukázal na mě, že můžeme použít $data.GetUpperBound(0) získat max indexové číslo.

     PS> $data.GetUpperBound(0) Three

    druhým nejčastějším způsobem je při iteraci seznamu a nezastavení ve správný čas. Vrátím se k tomu, když mluvíme o použití smyčkyfor.,

    aktualizace položek

    můžeme použít stejný index k aktualizaci stávajících položek v poli. To nám umožňuje přímý přístup k aktualizaci jednotlivých položek.

     $data = 'dos' $data = 'tres'

    Pokud se budeme snažit aktualizovat položku, která je za poslední prvek, pak dostaneme Index was outside the bounds of the array. chyba.

    vrátím se k tomu později, když mluvím o tom, jak zvětšit pole.

    Iterace

    V určitém okamžiku, budete muset chodit nebo opakovat celý seznam a provést nějakou akci pro každou položku v poli.,

    ropovod

    pole a potrubí PowerShell jsou určeny pro sebe. Jedná se o jeden z nejjednodušších způsobů, jak tyto hodnoty zpracovat. Když předáte pole do potrubí, každá položka uvnitř pole je zpracována individuálně.

     PS> $data = 'Zero','One','Two','Three' PS> $data | ForEach-Object {"Item: "} Item: Item: Item: Item: 

    Pokud jste neviděli $PSItem předtím, jen vím, že jeho to samé jako $_. Můžete použít jeden, protože oba představují aktuální objekt v potrubí.,

    ForEach loop

    ForEach loop funguje dobře se sbírkami. Pomocí syntaxe: foreach ( <variable> in <collection> )

     foreach ( $node in $data ) { "Item: " }

    ForEach metoda

    mám tendenci zapomenout na tento jeden, ale to funguje dobře pro jednoduché operace. PowerShell umožňuje volat .ForEach() na kolekcích.

     PS> $data.foreach({"Item "}) Item Item Item Item 

    .foreach() bere parametr, který je blok skriptu. Můžete zrušit závorky a jen poskytnout blok skriptu.,

     $data.foreach{"Item "}

    jedná se o méně známou syntaxi, ale funguje stejně. Tato metoda foreach byla přidána v PowerShell 4.0.

    pro smyčku

    smyčkafor se používá ve většině ostatních jazyků, ale v PowerShellu to moc nevidíte. Když to vidíte, je to často v kontextu chůze pole.

     for ( $index = 0; $index -lt $data.count; $index++) { "Item: " -f $data }

    první věc, kterou můžeme udělat, je inicializovat $index 0., Pak přidáme podmínku, že $index musí být menší než $data.count. Nakonec určíme, že pokaždé, když smyčíme, že musím zvýšit index o 1. V tomto případě $index++ je zkratka pro $index = $index + 1.

    kdykoli používáte smyčku for, věnujte zvláštní pozornost stavu. Použil jsem $index -lt $data.count zde. Je velmi snadné získat stav trochu špatně, abyste se dostali do jedné chyby ve vaší logice., Použití $index -le $data.count nebo $index -lt ($data.count - 1) jsou někdy tak mírně špatné. To by způsobilo, že váš výsledek zpracovává příliš mnoho nebo příliš málo položek. Toto je klasika vypnutá jednou chybou.

    switch loop

    to je ten, který je velmi snadné přehlédnout. Pokud poskytnete pole k příkazu přepínače, bude odpovídat na každou položku v poli.

     $data = 'Zero','One','Two','Three' switch( $data ) { 'One' { 'Tock' } 'Three' { 'Tock' } Default { 'Tick' } }

    vytvoří tento výstup:

     Tick Tock Tick Tock

    Existuje mnoho skvělých věcí, jako je to, které můžeme udělat s switch prohlášení., Mám další článek věnovaný tomuto.

    • Vše, co jste kdy chtěli vědět o příkazu switch

    Aktualizace hodnot

    Když se vaše pole je kolekce řetězce nebo celá čísla (typ hodnoty), někdy budete chtít aktualizovat hodnoty v poli jako smyčka nad nimi. Většina výše uvedených smyček používá proměnnou ve smyčce, která drží kopii hodnoty. Pokud tuto proměnnou aktualizujete, původní hodnota v poli není aktualizována.

    výjimkou z tohoto příkazu je smyčkafor., Pokud chcete projít pole a aktualizovat hodnoty uvnitř, pakfor loop je to, co hledáte.

     for ( $index = 0; $index -lt $data.count; $index++ ) { $data = "Item: " -f $data }

    příklady trvá hodnota o index, je tu pár změn, a pak používá stejný index přiřadit zpět.

    pole objektů

    zatím je jediná věc, kterou jsme umístili do pole, typ hodnoty, ale pole mohou také obsahovat objekty.

     $data = @( @{FirstName='Kevin';LastName='Marquette'} @{FirstName='John'; LastName='Doe'} )

    Mnoho rutin vrátí kolekce objektů jako pole, když je přiřadíte do proměnné.,

     $processList = Get-Process

    Všechny základní funkce již jsme mluvili o stále platí pro pole objektů s několika detaily, které stojí za zmínku.

    přístup k vlastnostem

    můžeme použít index pro přístup k jednotlivým položkám ve sbírce stejně jako u typů hodnot.

     PS> $data FirstName LastName ----- ---- Kevin Marquette

    můžeme přistupovat a aktualizovat vlastnosti přímo.,

     PS> $data.FirstName Kevin PS> $data.FirstName = 'Jay' PS> $data FirstName LastName ----- ---- Jay Marquette

    Array vlastnosti

    Normálně byste vyjmenovat celý seznam, jako je tento, aby přístup ke všem vlastnosti:

     PS> $data | ForEach-Object {$_.LastName} Marquette Doe

    Nebo pomocí Select-Object -ExpandProperty rutiny.

     PS> $data | Select-Object -ExpandProperty LastName Marquette Doe

    Ale PowerShell nám nabízí možnost požádat LastName přímo. PowerShell je všechny vyjmenuje a dá nám čistý seznam.,

     PS> $data.LastName Marquette Doe

    výčet se stále děje, ale nevidíme složitost za ním.

    Kde Object-filtrování

    Toto je místo, kde Where-Object přichází tak můžeme filtrovat a vybrat, co chceme z pole na základě vlastností objektu.

     PS> $data | Where-Object {$_.FirstName -eq 'Kevin'} FirstName LastName ----- ---- Kevin Marquette

    můžeme psát, že stejný dotaz, jako je tento, aby si FirstName hledáme.,

     $data | Where FirstName -eq Kevin

    , Kde()

    Pole Where() metody je, že umožňuje zadat scriptblock pro filtr.

     $data.Where({$_.FirstName -eq 'Kevin'})

    tato funkce byla přidána v PowerShell 4.0.

    Aktualizace objektů v smyčky

    S typy hodnot, jediný způsob, jak aktualizovat pole je použít pro smyčce, protože potřebujeme znát index nahradit hodnotu. S objekty máme více možností, protože se jedná o referenční typy., Zde je rychlý příklad:

     foreach($person in $data) { $person.FirstName = 'Kevin' }

    Tato smyčka je chůze každý objekt v $data pole. Protože objekty jsou referenční typy, proměnná $person odkazuje na přesně stejný objekt, který je v poli. Takže aktualizace jeho vlastností aktualizuje originál.

    stále nemůžete nahradit celý objekt tímto způsobem. Pokud se pokusíte přiřadit nový objekt proměnné $person, aktualizujete proměnnou odkaz na něco jiného, co již neukazuje na původní objekt v poli., To nebude fungovat, jako byste očekávat, že:

     foreach($person in $data) { $person = @{ FirstName='Kevin' LastName='Marquette' } }

    Operátoři

    operátoři v PowerShell také práce na polích. Některé z nich fungují trochu jinak.

    -připojte se

    operátor-join je nejviditelnější, takže se na něj nejprve podíváme. Líbí se mi operátor -join a často jej používám. Připojí se ke všem prvkům v poli pomocí znaku nebo řetězce, který zadáte.,

     PS> $data = @(1,2,3,4) PS> $data -join '-' 1-2-3-4 PS> $data -join ',' 1,2,3,4

    Jednou z funkcí, která se mi líbí o -join provozovatel, který zpracovává jednotlivé položky.

     PS> 1 -join '-' 1

    používám to uvnitř protokolování a podrobné zprávy.

     PS> $data = @(1,2,3,4) PS> "Data is $($data -join ',')." Data is 1,2,3,4.

    -připojte se k $array

    zde je chytrý trik, na který mi Lee Dailey poukázal., Pokud jste někdy chtěli připojit vše bez oddělovač, místo toho, aby dělal tohle:

     PS> $data = @(1,2,3,4) PS> $data -join $null 1234

    můžete použít -join s pole jako parametr s žádný prefix. Podívejte se na tento příklad, abyste viděli, o čem mluvím.

     PS> $data = @(1,2,3,4) PS> -join $data 1234

    -nahradit a -split

    další operátory jako -replace -split bude provádět na každou položku v poli. Nemohu říci, že jsem je někdy použil tímto způsobem, ale zde je příklad.,

     PS> $data = @('ATX-SQL-01','ATX-SQL-02','ATX-SQL-03') PS> $data -replace 'ATX','LAX' LAX-SQL-01 LAX-SQL-02 LAX-SQL-03

    -obsahuje

    -contains operátor vám umožní zkontrolovat pole hodnot, aby zjistil, jestli to obsahuje zadanou hodnotu.

     PS> $data = @('red','green','blue') PS> $data -contains 'green' True

    -v

    Když budete mít jednu hodnotu, kterou chcete k ověření se shoduje se několik hodnot, můžete použít -in operátor. Hodnota by byla vlevo a pole na pravé straně operace.,

     PS> $data = @('red','green','blue') PS> 'green' -in $data True

    to může být drahé, pokud je seznam velký. Pokud kontroluji více než 4-5 hodnot, často použiji regexový vzor.

     PS> $data = @('red','green','blue') PS> $pattern = "^({0})$" -f ($data -join '|') PS> $pattern ^(red|green|blue)$ PS> 'green' -match $pattern True

    -eq a -ne

    Rovnost a pole může dostat komplikované. Když je pole na levé straně, každá položka bude porovnána. Namísto návratu True vrátí objekt, který odpovídá.,

     PS> $data = @('red','green','blue') PS> $data -eq 'green' green

    Při použití -ne operátor, dostaneme všechny hodnoty, které nejsou rovné, aby naše hodnoty.

     PS> $data = @('red','green','blue') PS> $data -ne 'green' red blue

    Při použití v if() prohlášení, hodnotu, která je vrácena, je True hodnota. Pokud není vrácena žádná hodnota ,jedná se o hodnotuFalse. Oba tyto další příkazy budou vyhodnoceny na True.,

     $data = @('red','green','blue') if ( $data -eq 'green' ) { 'Green was found' } if ( $data -ne 'green' ) { 'And green was not found' }

    vrátím se k tomu ve chvíli, kdy mluvíme o testování $null.

    -match

    operátor-match se pokusí porovnat každou položku ve sbírce.

     PS> $servers = @( 'LAX-SQL-01' 'LAX-API-01' 'ATX-SQL-01' 'ATX-API-01' ) PS> $servers -match 'SQL' LAX-SQL-01 ATX-SQL-01

    Při použití -match s jedinou hodnotu, speciální proměnné $Matches dostane naplněn zápas info. To není případ, kdy je pole zpracováno tímto způsobem.

    stejný přístup můžeme použít s Select-String.,

     $servers | Select-String SQL

    jsem se blíže podívat na Select-String-match $matches proměnná v jiném příspěvku nazývá mnoho způsobů, jak použít regulární výraz.

    $null nebo empty

    testování $null nebo prázdná pole mohou být složité. Zde jsou společné pasti s poli.

    na první pohled toto prohlášení vypadá, že by mělo fungovat.

     if ( $array -eq $null) { 'Array is $null' }

    Ale jen jsem nad tím, jak -eq kontroluje každou položku v poli., Takže můžeme mít pole z několika položek s jediným $hodnota null, a to by vyhodnotit, aby $true

     $array = @('one',$null,'three') if ( $array -eq $null) { 'I think Array is $null, but I would be wrong' }

    To je důvod, proč je nejlepší cvičit, aby místo $null na levé straně provozovatele. To dělá tento scénář non-problém.

     if ( $null -eq $array ) { 'Array actually is $null' }

    a$null pole není totéž jako prázdné pole. Pokud víte, že máte pole, zkontrolujte počet objektů v něm., Pokud je pole $null, bude počet 0.

     if ( $array.count -gt 0 ) { 'Array is not empty' }

    je zde ještě jedna past. Můžete použít count i když máte jeden objekt, Pokud tento objekt není PSCustomObject. Jedná se o chybu, která je opravena v PowerShell 6.1. To je dobrá zpráva, ale spousta lidí je stále na 5.1 a musí si na to dávat pozor.

     PS> $object = @{Name='TestObject'} PS> $object.count $null

    Pokud jste stále na PowerShell 5.,1, můžete zabalit objekt do pole před kontrolou počtu získat přesný počet.

     if ( @($array).count -gt 0 ) { 'Array is not empty' }

    Chcete-li jej plně hrát bezpečně, Zkontrolujte$null a poté zkontrolujte počet.

     if ( $null -ne $array -and @($array).count -gt 0 ) { 'Array is not empty' }

    eq

    nedávno jsem viděl někoho zeptat, jak ověřit, že každá hodnota v matici odpovídá dané hodnotě. Reddit user / u / bis měl toto chytré řešení, které kontroluje nesprávné hodnoty a pak převrátí výsledek.,

     $results = Test-Something if ( -not ( $results -ne 'Passed') ) { 'All results a Passed' }

    Přidání do pole

    V tomto bodě, začínáš se divit, jak přidat položky do pole. Rychlá odpověď je, že nemůžete. pole je pevná velikost v paměti. Pokud ji potřebujete pěstovat nebo do ní přidat jednu položku, musíte vytvořit nové pole a zkopírovat všechny hodnoty ze starého pole. To zní draho a jako spousta práce, Nicméně PowerShell skrývá složitost vytváření nového pole.

    přidání pole

    k vytvoření nového pole můžeme použít adiční operátor s poli., Tak vzhledem k tomu, tyto dvě pole:

     $first = @( 'Zero' 'One' ) $second = @( 'Two' 'Three' )

    můžeme přidat nich společně, aby se nové pole.

     PS> $first + $second Zero One Two Three

    Navíc se rovná +=

    můžeme vytvořit nové pole v místě a přidat položky do ní, jako je tento:

     $data = @( 'Zero' 'One' 'Two' 'Three' ) $data += 'four'

    Jen si pamatujte, že pokaždé, když budete používat += že jste duplikaci a vytváření nového pole. To není problém pro malé datové sady, ale to váhy velmi špatně.,

    přiřazení potrubí

    můžete přiřadit výsledky jakéhokoli potrubí do proměnné. Bude to pole, pokud obsahuje více položek.

     $array = 1..5 | ForEach-Object { "ATX-SQL-$PSItem" }

    Normálně, když si myslíme, že pomocí potrubí, myslíme si, že typické PowerShell one-vložky. Potrubí můžeme využít pomocíforeach() příkazů a dalších smyček. Takže místo přidání položek do pole ve smyčce, můžeme upustit položky na potrubí.,

     $array = foreach ( $node in (1..5)) { "ATX-SQL-$node" }

    přiřazením výsledků foreach do proměnné, jsme se zachytit všechny objekty a vytvoření jednotného pole.

    typy polí

    ve výchozím nastavení je pole v PowerShellu vytvořeno jako] Typ. To mu umožňuje obsahovat jakýkoli typ objektu nebo hodnoty. Funguje to proto, že vše je zděděno od typu PSObject.

    silně zadaná pole

    pomocí podobné syntaxe můžete vytvořit pole jakéhokoli typu., Když vytvoříte silně zadané pole, může obsahovat pouze hodnoty nebo objekty zadaného typu.

    ArrayList

    Přidání položek do pole je jedním z jeho největších omezení, ale existuje několik dalších sbírek, na které se můžeme obrátit.

    ArrayList je obvykle jednou z prvních věcí, o kterých si myslíme, že potřebujeme pole, které je rychlejší pro práci. Chová se jako objektové pole na každém místě, které potřebujeme, ale rychle zpracovává přidávání položek.

    takto vytvoříme ArrayList a přidáme do něj položky.,

     $myarray = ::new() $myArray.Add('Value')

    voláme do .Net, aby si tento typ. V tomto případě používáme výchozí konstruktor k jeho vytvoření. Poté zavoláme metodu Add a přidáme k ní položku.

    důvod, proč používám na začátku řádku je potlačit návratový kód. Některé hovory. net to udělají a mohou vytvořit neočekávaný výstup.

    Pokud jediná data, která máte v poli, jsou řetězce, podívejte se také na použití StringBuilder., Je to téměř stejná věc, ale má některé metody, které jsou jen pro řešení řetězců. StringBuilder je speciálně navržen pro výkon.

    • Zřetězit řetězce pomocí StringBuilder

    je To opravdu běžné vidět lidi přesunout do ArrayList z polí. Ale pochází z doby, kdy C# neměl obecnou podporu., ArrayList je odepisován na podporu pro generické List

    Obecný Seznam

    obecný typ je zvláštní typ v C#, které definují zobecněné třídy a uživatel specifikuje datové typy to bude používat, když vytvořil. Takže pokud chcete seznam čísel, nebo řetězců, byste definovat, že chcete seznam int nebo string typy.

    zde je návod, jak vytvořit seznam řetězců.

     $mylist = ]::new()

    nebo seznam čísel.,

     $mylist = ]::new()

    kterou můžeme použít existující pole na seznam, jako je tento bez vytvoření objektu první:

     $mylist = ]@(1,2,3)

    můžeme zkrátit syntaxe trochu s using namespace prohlášení v PowerShell 5 a novější. Příkaz using musí být prvním řádkem vašeho skriptu. Deklarováním jmenného prostoru vám PowerShell umožní nechat jej mimo datové typy, když je odkazujete.,

     using namespace System.Collections.Generic $myList = ]@(1,2,3)

    Toto je List mnohem více použitelné.

    máte k dispozici podobnou metodu Add. Na rozdíl od Arraylistu neexistuje návratová hodnota metody Add, takže ji nemusíme void.

     $myList.Add(10)

    A můžeme stále přístup prvky, jako ostatní pole.,

     PS> $myList 10

    Seznam

    můžete mít seznam libovolného typu, ale když nevíš, typ objektů, můžete použít ] je obsahují.

     $list = ]::new()

    Remove()

    ArrayList obecné List jak podporu odebírání položek z kolekce.

     using namespace System.Collections.Generic $myList = ]@('Zero','One','Two','Three') $myList.Remove("Two") Zero One Three

    při práci s typy hodnot odstraní první ze seznamu., Můžete to volat znovu a znovu, abyste tuto hodnotu odstranili. Pokud máte referenční typy, musíte poskytnout objekt, který chcete odstranit.

     ]$drives = Get-PSDrive $drives.remove($drives)
     $delete = $drives $drives.remove($delete)

    odstranit, metoda vrátí true, pokud byl schopen najít a odstranit položky z kolekce.

    více sbírek

    existuje mnoho dalších sbírek, které lze použít, ale to jsou dobré generické náhrady pole., Pokud máte zájem dozvědět se více o těchto možnostech, podívejte se na tuto podstatu, kterou dal Mark Kraus dohromady.

    další nuance

    Nyní, když jsem pokryl všechny hlavní funkce, zde je několik dalších věcí, které jsem chtěl zmínit, než to zabalím.

    pre-sized arrays

    zmínil jsem se, že po vytvoření pole nemůžete změnit velikost pole. Můžeme vytvořit pole předem určené velikosti voláním pomocí konstruktorunew($size).,

     $data = ]::new(4) $data.count 4

    násobící pole

    zajímavým malým trikem je, že pole můžete vynásobit celočíselným číslem.

     PS> $data = @('red','green','blue') PS> $data * 3 red green blue red green blue red green blue

    Inicializovat s 0

    běžný scénář je, že chcete vytvořit pole s nulami. Pokud budete mít pouze celá čísla, silně zadané pole celých čísel bude výchozí pro všechny nuly.

     PS> ]::new(4) 0 0 0 0

    k tomu můžeme použít i násobící trik.,

     PS> $data = @(0) * 4 PS> $data 0 0 0 0

    pěkná věc o násobení trik je, že můžete použít jakoukoli hodnotu. Takže pokud byste raději měli 255 jako výchozí hodnotu, bylo by to dobrý způsob, jak to udělat.

     PS> $data = @(255) * 4 PS> $data 255 255 255 255

    Vnořených polí

    pole uvnitř pole se nazývá vnořená pole. Nepoužívám to moc v PowerShell, ale použil jsem je více v jiných jazycích. Zvažte použití pole polí, když vaše data zapadají do mřížky jako vzor.

    zde jsou dva způsoby, jak můžeme vytvořit 2 dimenzionální pole.,

     $data = @(@(1,2,3),@(4,5,6),@(7,8,9)) $data2 = @( @(1,2,3), @(4,5,6), @(7,8,9) )

    čárka je v těchto příkladech velmi důležitá. Dal jsem dřívější příklad normálního pole na více řádcích, kde čárka byla volitelná. To není případ vícerozměrného pole.

    způsob, jakým používáme indexovou notaci, se nyní mírně mění, když máme vnořené pole. Pomocí $data výše, takto bychom přistupovali k hodnotě 3.

     PS> $outside = 0 PS> $inside = 2 PS> $data 3

    přidejte sadu konzoly pro každou úroveň vnoření pole., První sada závorek je pro vnější většinu pole a pak budete pracovat si cestu odtamtud.

    Write-Output-NoEnumerate

    PowerShell rád rozbalí nebo vyčíslí pole. To je základní aspekt způsobu, jakým PowerShell používá potrubí, ale jsou chvíle, kdy nechcete, aby se to stalo.

    i běžně trubkové objekty Get-Member dozvědět se více o nich. Když jsem potrubí pole k němu, to se rozbalí a Get-člen vidí členy pole a ne skutečné pole.,

     PS> $data = @('red','green','blue') PS> $data | Get-Member TypeName: System.String ...

    abyste zabránili rozbalení pole, můžete použít Write-Object -NoEnumerate.

     PS> Write-Output -NoEnumerate $data | Get-Member TypeName: System.Object ...

    mám druhý způsob, jak to udělat, je to spíš hack (a já se snažím, aby se zabránilo hacky, jako je tento). Můžete umístit čárku před pole, než ji potrubí.

     PS> ,$data | Get-Member TypeName: System.Object ...

    Vrátit pole

    un-balení polí také se stane, když výstup nebo návratové hodnoty z funkce., Stále můžete získat pole, pokud přiřadíte výstup proměnné, takže to není běžně problém.

    úlovek je, že budete mít nové pole. Pokud je to někdy problém, můžete použít Write-Output -NoEnumerate $array nebo return ,$array obejít to.

    ještě něco?

    vím, že je to všechno hodně, co je třeba vzít. Doufám, že se z tohoto článku něco naučíte pokaždé, když si to přečtete, a že se ukáže, že je to pro vás dobrý odkaz na dlouhou dobu., Pokud jste zjistili, že je to užitečné, podělte se o to s ostatními, o kterých si myslíte, že z toho získají hodnotu.

    odtud bych vám doporučil podívat se na podobný příspěvek, který jsem napsal o hashtables.

    Napsat komentář

    Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *