- 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 -join
a č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.
Napsat komentář