• 10/08/2020
  • 24 minut ke čtení
    • j
    • h
    • V

Pole jsou základní jazykové funkce ve většině programovacích jazyků. Jde o sbírku předmětů nebo předmětů, kterým je těžké se vyhnout. Podívejme se blíže na pole a všechno onimusí nabídnout.,

Poznámka:

původní verze tohoto článku vyšla na blogu napsal @KevinMarquette. Tým ThePowerShell děkuje Kevinovi za sdílení tohoto obsahu s námi. Podívejte se prosím na jeho blog atPowerShellExplained.com.

co je to pole?

začnu se základním technickým popisem toho, jaká pole jsou a jak jsou používána programovacími jazyky, 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 array nebo přistupovat k jednotlivým položkám pomocí indexu. Pole je vytvořeno jako sekvenční kuspaměť, 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áciv PowerShellu.,

Vytvořit pole

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

PS> $data = @()PS> $data.count0

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.count4PS> $dataZeroOneTwoThree

toto pole má 4 položky. Když voláme proměnnou $data, vidíme seznam našich položek. Pokud je to anarray řetězců, pak dostaneme jeden řádek na řetězec.

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

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

raději deklaruji svá pole na více řádcích. Nejen, že je snazší číst, kdymáte více položek, ale také usnadňuje porovnání s předchozími verzemi při použití sourcecontrol.

Další syntaxe

je obecně známo, že @() je syntaxe pro vytvoření pole, ale comma-separated listswork 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 vytvořit stringsat konzole.

$data = Write-Output Zero One Two Three

to je užitečné, protože nemusíte dávat uvozovky kolem řetězců, když parametr přijmeúvěry. 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> $dataZero

důvod, proč jsme použít žádné tady je, že první položka je na začátku seznamu, takže jsme použijte odsazení 0 položek se k ní dostat. Chcete-li se dostat k druhé položce, musíme použít offset 1 toskip první položku.

PS> $dataOne

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

PS> $dataThree

Index

nyní můžete vidět, proč jsem vybral hodnoty, které jsem udělal pro tento příklad. Představil jsem to jako offsetprotože to je to, co ve skutečnosti je, ale tento offset je častěji označován jako index. Anindex, 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 dostanete jednu položku zpět.PowerShell je mnohem flexibilnější. Můžete použít více indexů najednou., Poskytnutím seznamuindexy, můžeme vybrat několik položek.

PS> $dataZeroTwoThree

položky jsou vráceny na základě pořadí poskytnutých indexů. Pokud duplikujete index, dostanete tuto položku v obou případech.

PS> $dataThreeZeroThree

můžeme určit posloupnost čísel s vestavěným.. operátorem.

PS> $dataOneTwoThree

funguje to i obráceně.

PS> $dataThreeTwoOne

záporné hodnoty indexu můžete použít k vyrovnání od konce. Takže pokud potřebujete poslední položku v seznamu, můžete použít -1.,

PS> $dataThree

zakázán

Ve většině jazyků, pokud se pokusíte přístup index položky, která je za konec pole, kde by jste si nějaké chyby, nebo výjimku. PowerShell tiše vrací nic.

PS> $null -eq $dataTrue

Nemůže index do pole null

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

PS> $empty = $nullSP> $emptyError: Cannot index into a null array.

takže se ujistěte, že vaše Pole nejsou $null než se pokusíte o 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.count4

PowerShell 3.0 přidal vlastnost počítání většině objektů. můžete mít jeden objekt a měl by to býtdát vám Počet 1.

PS> $date = Get-DatePS> $date.count1

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

PS> $null.count0

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

Off-by-one chyby

běžná chyba programování je vytvořena, protože pole začínají na indexu 0. Chyby Off-by-one mohou býtzavedené dvěma způsoby.

první je psychicky myšlení chcete druhou položku a pomocí indexu 2 a opravdu začíná třetí bod. Nebo tím, že si myslíte, že máte čtyři položky a chcete poslední položku, takže používáte countpro přístup k poslední položce.,

$data

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

PS> $dataThree

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

PS> $dataThree

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

PS> $data.GetUpperBound(0)3PS> $dataThree

druhým nejčastějším způsobem je při iteraci seznamu a nezastavení ve správný čas. Navštívím to, 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 jednotlivým položkám.

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

Pokud se pokusíme aktualizovat položku, která je za posledním prvkem,dostanemeIndex 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 možná muset projít nebo iterovat celý seznam a provést nějakou akci pro každého v poli.

ropovod

pole a potrubí PowerShell jsou určeny pro sebe. To je jeden z nejjednodušších způsobůproces nad těmito hodnotami. Když předáte pole do potrubí, je každá položka uvnitř pole 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 to je to samé jako $_., Můžete použít buď 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 tocall .ForEach() na kolekci.

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

.foreach() má parametr, který je blok skriptů., Můžete zrušit závorky a jenposkytnout blok skriptu.

$data.foreach{"Item "}

jedná se o méně známou syntaxi, ale funguje stejně. Tato metoda foreach byla přidána inpowershell 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 specifikujeme, že pokaždé, když smyčíme, že musím zvýšit theindex o 1. V tomto případě $index++ je zkratka pro $index = $index + 1.

kdykoli používáte smyčkufor, věnujte zvláštní pozornost stavu. Použil jsem$index -lt $data.count zde. Je snadné získat stav trochu špatně, abyste získali off-by-oneerror ve vaší logice., Použití $index -le $data.count nebo $index -lt ($data.count - 1) jsou někdy soslightly špatně. To by způsobilo, že váš výsledek zpracovává příliš mnoho nebo příliš málo položek. Jedná se o chybu off-by-one.

switch loop

to je ten, který lze snadno přehlédnout. Pokud poskytnete pole příkazu přepínače, svědectví každou položku v poli.

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

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

  • 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 možná budete chtít, toupdate hodnoty v poli jako smyčka nad nimi. Většina výše uvedených smyček používá proměnnou vsazeno, které drží kopii hodnoty. Pokud tuto proměnnou aktualizujete, je původní hodnota v polineaktualizována.

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

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

tento příklad má hodnotu podle indexu, provede několik změn a poté použije stejný index k přiřazení zpět.

pole objektů

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

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

mnoho cmdletů vrací sbírky objektů jako polí, když je přiřadíte proměnné.,

$processList = Get-Process

Všechny základní funkce již jsme mluvili o stále platí pro pole objektů s fewdetails 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> $dataFirstName LastName----- ----Kevin Marquette

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

PS> $data.FirstNameKevinPS> $data.FirstName = 'Jay'PS> $dataFirstName 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}MarquetteDoe

Nebo pomocí Select-Object -ExpandProperty rutiny.

PS> $data | Select-Object -ExpandProperty LastNameMarquetteDoe

Ale PowerShell nám nabízí možnost požádat LastName přímo. PowerShell vyjmenuje themall pro nás a vrátí čistý seznam.

PS> $data.LastNameMarquetteDoe

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 arraybased na vlastnosti objektu.

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

můžeme psát, že stejný dotaz na ten 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 vědět, theindex 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 prochází každým objektem v poli$data. Protože objekty jsou referenční typy, proměnná$person odkazuje na přesně stejný objekt, který je v poli. Takže aktualizace jejíchvlastnosti aktualizují originál.,

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

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

operátory

operátory v PowerShell také pracují na polích. Některé z nich fungují trochu jinak.

-připojte se

operátor-join je nejzřetelnější, takže se na to podívejme nejprve., Líbí se mi operátor -joina často jej používám. Spojuje všechny prvky v poli s charakterem nebo řetězcemjste zadali.

PS> $data = @(1,2,3,4)PS> $data -join '-'1-2-3-4PS> $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ých zpráv.

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 everythingwithout oddělovač, místo toho, aby dělal tohle:

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

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

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

-nahradit a -split

další operátory jako -replace -split execute 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-01LAX-SQL-02LAX-SQL-03

-obsahuje

-contains provozovatel umožňuje zkontrolovat pole hodnot, aby zjistil, jestli to obsahuje určenou dobu.

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ěoperátor.

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

to může být drahé, pokud je seznam velký. Často používám regexový vzor, pokud kontroluji více nežněkolik hodnot.,

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

-eq a-ne

rovnost a pole se mohou komplikovat. Když je pole na levé straně, dostane se každá položkave srovnání. 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 získáme všechny hodnoty, které se rovnají naší hodnotě.

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

Při použití v if() prohlášení, hodnotu, která je vrácena, je True hodnota., Pokud není vrácena žádná hodnota, je to hodnota False. Oba tyto další příkazy vyhodnotí 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

-match operátor se snaží shodovat 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-01ATX-SQL-01

Při použití -match s jedinou hodnotu, speciální proměnné $Matches dostane naplněn matchinfo., 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 právě jsem prošel, jak -eq kontroluje každou položku v poli. Takže můžeme mít pole severalitems 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, zkontrolujtepočítání objektů v něm., Pokud je pole $null, počet je 0.

if ( $array.count -gt 0 ){ "Array isn't empty"}

je zde ještě jedna past. Můžete použít count i když máte singleobject, 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 v poli před kontrolou hrabě dostat přesný počet.,

if ( @($array).count -gt 0 ){ "Array isn't 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 isn't 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řekročí výsledek.

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

přidání do polí

v tomto okamžiku se začínáte divit, jak přidat položky do pole. Rychlá odpověď je, že youcan ‚ t. array je pevná velikost v paměti., Pokud ji potřebujete pěstovat nebo přidat jednu položku, pakmusíte vytvořit nové pole a zkopírovat všechny hodnoty ze starého pole. To zní jako hodně práce, Nicméně PowerShell skrývá složitost vytváření nového pole. PowerShellimplements operátor sčítání () pro pole.

Poznámka

PowerShell neprovádí operaci odčítání. Pokud chcete flexibilní alternativu k anarray, musíte použít obecný objekt List.,

přidání pole

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

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

můžeme je přidat dohromady, abychom získali nové pole.

PS> $first + $secondZeroOneTwoThree

Navíc se rovná +=

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

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

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

přiřazení potrubí

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

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

normálně když uvažujeme o použití potrubí, myslíme na typické jednodílné vložky PowerShell. Potrubí můžeme použít pomocíforeach() a dalších smyček. Takže místo přidání položek do anarray ve smyčce, můžeme upustit položky na potrubí.

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

Array Typy

ve výchozím nastavení, pole v PowerShell je vytvořen jako ] typu., To mu umožňuje obsahovatjakýkoli typ objektu nebo hodnoty. Funguje to proto, že vše je zděděno z 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 kolekcíže se můžeme obrátit na řešení tohoto problému.,

ArrayList je obvykle jednou z prvních věcí, které si myslíme, že když potřebujeme pole, které isfaster pracovat. Působí jako objektové pole na každém místě, které potřebujeme, ale zpracovává addingitems rychle.

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í konstruktorvytvořit. 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. Some.NET hovory to dě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 usingStringBuilder. Je to skoro totéž, ale má některé metody, které jsou jen pro řešení problémů. StringBuilder je speciálně navržen pro výkon.

je běžné vidět, jak se lidé pohybují naArrayList z polí. Ale pochází z doby, kdy C# neměl obecnou podporu., ArrayList je zastaralý podporu pro generické List

Obecný Seznam

obecný typ je zvláštní typ v C#, který definuje zobecněné třídy a uživatel specifikuje data typy používá, když vytvořil. Takže pokud chcete seznam čísel, nebo řetězců, ty by definethat 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 seznamu, jako je tato, aniž by se vytvořila první objekt:

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

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

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

díky tomu je List mnohem užitečnější.,

máte k dispozici podobnou metodu Add. Na rozdíl od ArrayList, neexistuje žádná návratová hodnota ontheAdd metoda, takže nemusíme to.

$myList.Add(10)

a stále můžeme přistupovat k prvkům jako k jiným polím.

PS> $myList10

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")ZeroOneThree

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

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

metoda remove vrací true pokud byla schopna najít a odebrat položku ze sbírky.

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 to, co dal Kraus dohromady.

další nuance

Nyní, když jsem pokryl všechny hlavní funkce, zde je několik dalších věcí, které jsem chtěl, 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 OFA předem určené velikosti voláním snew($size) Konstruktor.

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

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 * 3redgreenblueredgreenblueredgreenblue

inicializovat s 0

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

PS> ]::new(4)0000

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

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

pěkná věc na multiplikačním triku je, že můžete použít libovolnou hodnotu. Takže pokud byste spíše měli 255 jako výchozí hodnotu, bylo by to dobrý způsob, jak to udělat.

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

vnořená pole

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

zde jsou dva způsoby, jak můžeme vytvořit dvourozměrné 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 navíce řádků, kde byla čárka 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 = 0PS> $inside = 2PS> $data3

přidejte sadu konzoly pro každou úroveň vnoření pole., První sada závorek je pro nejvzdálenější pole a pak se odtud dostanete.

Write-Output-NoEnumerate

PowerShell rád rozbalí nebo vyčíslí pole. To je základní aspekt způsobu, jakým PowerShell používá thepipeline, 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, itgets rozbalí a Get-člen vidí členy pole a ne skutečné pole.,

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

Chcete-li zabránit rozbalení pole, můžete použít Write-Object -NoEnumerate.

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

mám druhý způsob, který je spíše hack (a snažím se vyhnout hackům, jako je tento). Můžete umístit acomma v přední části pole, než ji potrubí.

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

vraťte pole

k rozbalení polí dochází také při výstupu nebo návratu hodnot z funkce. 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 máte nové pole., Pokud je to někdy problém, můžete použítWrite-Output -NoEnumerate $array nebo return ,$array obejít to.

ještě něco?