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
- eq
- Pole přírůstek
- Navíc se rovná +=
- Potrubí úkol
- Důrazně typované pole
- ArrayList
- Obecný Seznam
- Seznamu
- Remove()
- Více sbírek
- Pre-velikosti polí
- Násobení polí
- Inicializovat s 0
- Vnořených polí
- Napsat-Výstup-NoEnumerate
- Vrátí pole
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.