Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Rövid leírás
A tömböket ismerteti, amelyek olyan adatstruktúrák, amelyeket elemek gyűjteményeinek tárolására terveztek.
Hosszú leírás
A tömb egy olyan adatstruktúra, amely elemek gyűjteményének tárolására szolgál. Az elemek lehetnek azonosak vagy különbözőek.
A Windows PowerShell 3.0-tól kezdve egy nulla vagy egy objektumból álló gyűjtemény tömbök bizonyos tulajdonságaival rendelkezik.
Tömb létrehozása és inicializálása
Tömb létrehozásához és inicializálásához rendeljen hozzá több értéket egy változóhoz. A tömbben tárolt értékeket vesszővel választja el, és a hozzárendelési operátor (=) választja el a változó nevétől.
Ha például egy $A nevű tömböt szeretne létrehozni, amely a 22, 5, 10, 8, 12, 9 és 80 numerikus (int) értéket tartalmazza, írja be a következőt:
$A = 22,5,10,8,12,9,80
Tömböket a tartomány operátorral (..) is létrehozhat és inicializálhat. Ha például egy "$B" nevű tömböt szeretne létrehozni és inicializálni, amely az 5–8 értékeket tartalmazza, írja be a következőt:
$B = 5..8
Ennek eredményeként $B négy értéket tartalmaz: 5, 6, 7 és 8.
Ha nincs megadva adattípus, a PowerShell minden tömböt objektumtömbként hoz létre (típus: System.Object[]). A tömb adattípusának meghatározásához használja a GetType() metódust. Például a $a tömb adattípusának meghatározásához írja be a következőt:
$a.GetType()
Erősen tipizált tömb létrehozásához, azaz olyan tömbhöz, amely csak egy adott típusú értékeket tartalmazhat, alakítsa a változót tömbtípusként, például string[], long[] vagy int32[]. Tömb beírásához a változó nevét zárójelek közé zárt tömbtípussal előzze meg. Ha például egy $ia nevű 32 bites egész tömböt szeretne létrehozni, amely négy egész számot (1500, 2230, 3350 és 4000) tartalmaz, írja be a következőt:
[int32[]]$ia = 1500,2230,3350,4000
Ennek eredményeképpen a $ia tömb csak egész számokat tartalmazhat.
Létrehozhat olyan tömböket, amelyek a Microsoft .NET keretrendszer bármely támogatott típusára vannak átalakítva. A folyamatokat ábrázoló objektumok Get-Process például a System.Diagnostics.Process típusúak. A folyamatobjektumok erősen típusos tömbjének létrehozásához írja be a következő parancsot:
[Diagnostics.Process[]]$zz = Get-Process
A tömb rész-kifejezés operátora
A tömb alkifejezés operátora tömböt hoz létre, még akkor is, ha nulla vagy egy objektumot tartalmaz.
A tömb operátor szintaxisa a következő:
@( ... )
A tömb operátorral nullából vagy egy objektumból álló tömböt hozhat létre. Például:
PS> $a = @("Hello World")
PS> $a.Count
1
PS> $b = @()
PS> $b.Count
0
A tömboperátor különösen hasznos a szkripteknél, amikor objektumokat kap, de nem tudja, hány objektumot fog kapni. Például:
$p = @(Get-Process Notepad)
További információ a tömb alkifejezés operátoráról: about_Operators.
Tömbelemek elérése és használata
Tömb olvasása
A tömbökre a változó nevével hivatkozhat. A tömb összes elemének megjelenítéséhez írja be a tömb nevét. Tegyük $a fel például, hogy egy tömb, amely 0, 1, 2, 9-ig egész számokat tartalmaz; beírva:
$a
0
1
2
3
4
5
6
7
8
9
A tömb elemeire indexet használhat, a 0. pozíciótól kezdve. Az indexszámot szögletes zárójelek közé kell foglalni. Ha például a $a tömb első elemét szeretné megjeleníteni, írja be a következőt:
$a[0]
0
A $a tömb harmadik elemének megjelenítéséhez írja be a következőt:
$a[2]
2
A tömb egy részét lekérheti az index tartományoperátorával. A tömb második-ötödik elemeinek lekéréséhez például a következőt kell beírnia:
$a[1..4]
1
2
3
4
A negatív számok a tömb végétől számítanak. A "-1" például a tömb utolsó elemére utal. A tömb utolsó három elemének megjelenítéséhez az index növekvő sorrendjében írja be a következőt:
$a = 0 .. 9
$a[-3..-1]
7
8
9
Ha csökkenő sorrendbe írja be a negatív indexeket, a kimenet megváltozik.
$a = 0 .. 9
$a[-1..-3]
9
8
7
Ennek a jelölésnek a használatakor azonban legyen óvatos. A jelölési ciklusok a véghatártól a tömb elejéig terjednek.
$a = 0 .. 9
$a[2..-2]
2
1
0
9
8
Az is gyakori hiba, ha feltételezzük, hogy $a[0..-2] a tömb minden elemére vonatkozik, kivéve az utolsót. A tömb első, utolsó és utolsó előtti elemére hivatkozik.
A plusz operátorral (+) kombinálhat egy tartományt egy tömb elemeinek listájával. Ha például a 0, 2 és 4–6 indexpozícióban szeretné megjeleníteni az elemeket, írja be a következőt:
$a = 0 .. 9
$a[0,2+4..6]
0
2
4
5
6
Emellett több tartomány és egyedi elem listázásához használhatja a plusz operátort is. Például az elemek nullától kettőig, négytől hatig, és az elem a nyolcadik pozícióban:
$a = 0..9
$a[+0..2+4..6+8]
0
1
2
4
5
6
8
Tömbelemek iterálása
Hurkoló szerkezeteket is használhat, például ForEach, For és While hurkokat a tömb elemeire való hivatkozáshoz. Ha például egy ForEach hurkot szeretne használni a $a tömb elemeinek megjelenítéséhez, írja be a következőt:
$a = 0..9
foreach ($element in $a) {
$element
}
0
1
2
3
4
5
6
7
8
9
A Foreach hurok iterálja a tömböt, és a tömb minden értékét visszaadja, amíg el nem éri a tömb végét.
A For ciklus akkor hasznos, ha számlálókat növeszt egy tömb elemeinek vizsgálata közben. Ha például egy For hurkot szeretne használni egy tömb minden más értékének visszaadásához, írja be a következőt:
$a = 0..9
for ($i = 0; $i -le ($a.length - 1); $i += 2) {
$a[$i]
}
0
2
4
6
8
A While ciklussal megjelenítheti a tömb elemeit, amíg egy meghatározott feltétel már nem teljesül. Ha például meg szeretné jeleníteni az elemeket a $a tömbben, amíg a tömbindex 4-nél kisebb, írja be a következőt:
$a = 0..9
$i=0
while($i -lt 4) {
$a[$i];
$i++
}
0
1
2
3
Tömbök tulajdonságai
Count or Length or LongLength
Annak meghatározásához, hogy hány elem van egy tömbben, használja a tulajdonságot Length vagy annak Count aliasát.
Longlength akkor hasznos, ha a tömb több mint 2 147 483 647 elemet tartalmaz.
$a = 0..9
$a.Count
$a.Length
10
10
Helyezés
A tömbben lévő dimenziók számát adja vissza. A PowerShell legtöbb tömbje csak egy dimenzióval rendelkezik. Még akkor is, ha azt hiszi, hogy többdimenziós tömböt épít; mint az alábbi példa:
$a = @(
@(0,1),
@("b", "c"),
@(Get-Process)
)
[int]$r = $a.Rank
"`$a rank: $r"
$a rank: 1
Egy valóban többdimenziós tömb PowerShellben való felépítéséhez a .Net Framework segítségére van szükség. Mint az alábbi példában:
[int[,]]$rank2 = [int[,]]::new(5,5)
$rank2.rank
2
Tömbök metódusai
Világos
Az összes elemértéket a tömb elemtípusának
Az alábbi példában $a egy objektumtömb.
$a = 1, 2, 3
$a.Clear()
$a | % { $null -eq $_ }
True
True
True
Ebben a példában a $intA kifejezetten egész számokat tartalmaz.
[int[]] $intA = 1, 2, 3
$intA.Clear()
$intA
0
0
0
Mindegyik számára
Lehetővé teszi a tömb minden elemének iterálását, és adott műveletet hajthat végre a tömb minden eleméhez.
A ForEach metódus számos túlterheléssel rendelkezik, amelyek különböző műveleteket hajtanak végre.
ForEach(scriptblock expression)
ForEach(type convertToType)
ForEach(string propertyName)
ForEach(string propertyName, object[] newValue)
ForEach(string methodName)
ForEach(string methodName, object[] arguments)
ForEach(scriptblock expression, object[] arguments)
ForEach(scriptblock kifejezés)
ForEach(scriptblock kifejezés, object[] argumentumok)
Megjegyzés:
A szintaxis használatához szkriptblokk szükséges. A zárójelek megadása nem kötelező.
Az alábbi példa bemutatja, hogyan használja a foreach metódust. Ebben az esetben a szándék a tömb elemeinek négyzetértékének generálása.
Vegye figyelembe, hogy ez a módszer a PowerShell v4-ben lett hozzáadva, és nem érhető el az ennél alacsonyabb verziókban. Korábbi verziók esetén használja a Pipelining metódust a ForEach-Object parancsmaghoz
$a = @(0 .. 3)
$a.ForEach({ $_ * $_})
0
1
4
9
Csakúgy, mint a -ArgumentList paraméter, ForEach-Objecta arguments paraméter lehetővé teszi az argumentumok tömbjének átadását egy szkriptblokknak, amely úgy van konfigurálva, hogy elfogadja őket.
ForEach(típus convertToType)
A ForEach metódus segítségével az elemek gyorsan átalakíthatók egy másik típusra; a következő példa bemutatja, hogyan lehet a karakterlánc-dátumok listáját [DateTime] típusra konvertálni.
@("1/1/2017", "2/1/2017", "3/1/2017").ForEach([datetime])
Sunday, January 1, 2017 12:00:00 AM
Wednesday, February 1, 2017 12:00:00 AM
Wednesday, March 1, 2017 12:00:00 AM
ForEach(sztring tulajdonságNév)
ForEach(karakterlánc tulajdonságNév, objektum[] újÉrték)
A ForEach metódus a gyűjtemény minden elemének tulajdonságértékeinek gyors lekérésére vagy beállítására is használható.
# Set all LastAccessTime properties of files to the current date.
(dir 'C:\Temp').ForEach('LastAccessTime', (Get-Date))
# View the newly set LastAccessTime of all items, and find Unique entries.
(dir 'C:\Temp').ForEach('LastAccessTime') | Get-Unique
Wednesday, June 20, 2018 9:21:57 AM
ForEach(karakterlánc metódus neve)
ForEach(sztring metódusnév, objektum[] argumentumok)
Végül ForEach metódusok használatával a gyűjtemény minden elemén végrehajthat egy metódust.
("one", "two", "three").ForEach("ToUpper")
ONE
TWO
THREE
Csakúgy, mint a -ArgumentList paraméter, ForEach-Objecta arguments paraméter lehetővé teszi az argumentumok tömbjének átadását egy szkriptblokknak, amely úgy van konfigurálva, hogy elfogadja őket.
Megjegyzés:
A Windows PowerShell 3.0-tól kezdődően a gyűjtemény egyes elemeinek tulajdonságainak és végrehajtási metódusainak lekérése a "Skaláris objektumok és gyűjtemények metódusai" használatával is elvégezhető. Erről itt olvashat bővebben about_methods
Hol
Lehetővé teszi a tömb elemeinek szűrését vagy kijelölését. A szkriptnek bármi mást kell kiértékelnie, $false mint: nulla (0), üres karakterlánc, vagy $null hogy az elem megjelenjen a Where
A Where metódusnak egy definíciója van.
Where(scriptblock expression[, WhereOperatorSelectionMode mode
[, int numberToReturn]])
A Expression szűréshez szükséges szkriptblokk, a mode választható argumentum további kiválasztási képességeket tesz lehetővé, a numberToReturn választható argumentum pedig lehetővé teszi a szűrő által visszaadott elemek számának korlátozását.
Megjegyzés:
A szintaxis használatához szkriptblokk szükséges. A zárójelek megadása nem kötelező.
Az alábbi példa bemutatja, hogyan választhatja ki az összes páratlan számot a tömbből.
(0..9).Where{ $_ % 2 }
1
3
5
7
9
A következő kiválasztási módok állnak rendelkezésre.
Alapértelmezett
A Default mód a Expression szkriptblokk használatával szűri az elemeket.
Ha egy numberToReturn van megadva, a visszaadandó elemek maximális számát adja meg.
# Get the zip files in the current users profile, sorted by LastAccessTime.
$Zips = dir $env:userprofile -Recurse '*.zip' | Sort-Object LastAccessTime
# Get the least accessed file over 100MB
$Zips.Where({$_.Length -gt 100MB}, 'Default', 1)
Megjegyzés:
Mind a Default mód, mind a First mód az első (numberToReturn) elemet adja vissza, és felcserélhető.
Utolsó
$h = (Get-Date).AddHours(-1)
$logs = dir 'C:\' -Recurse '*.log' | Sort-Object CreationTime
# Find the last 5 log files created in the past hour.
$logs.Where({$_.CreationTime -gt $h}, 'Last', 5)
Kihagyás:
A SkipUntil mód kihagyja a gyűjtemény összes objektumát, amíg egy objektum át nem adja a szkriptblokk kifejezésszűrőt. Ezután visszaadja az összes fennmaradó gyűjteményelemet tesztelés nélkül.
Csak egy átmenő tételt tesztelnek
Ez azt jelenti, hogy a visszaküldött gyűjtemény olyan átmenő és nem átmenő elemeket is tartalmaz, amelyek NEM lettek tesztelve.
A visszaadott elemek száma korlátozható, ha értéket ad át a numberToReturn argumentumnak.
$computers = "Server01", "Server02", "Server03", "localhost", "Server04"
# Find the first available online server.
$computers.Where({ Test-Connection $_ }, 'SkipUntil', 1)
localhost
Amíg
A Until mód megfordítja a SkipUntil módot. Visszaadja összes elemet egy gyűjteményben, amíg egy elem nem felel meg a szkriptblokk kifejezésének. Miután egy elem átadja a szkriptblokk kifejezés, a Where metódus leállítja az elemek feldolgozását.
Ez azt jelenti, hogy megkapja a metódus Where elemkészletét.
Miután egy tétel átment, a többit NEM teszteljük és nem küldjük vissza.
A visszaadott elemek száma korlátozható, ha értéket ad át a numberToReturn argumentumnak.
# Retrieve the first set of numbers less than or equal to 10.
(1..50).Where({$_ -gt 10}, 'Until')
# This would perform the same operation.
(1..50).Where({$_ -le 10})
1
2
3
4
5
6
7
8
9
10
Megjegyzés:
Mind a Until, mind a SkipUntil annak az elvnek alapján működik, hogy egy tételt nem tesztelnek.
Untilvisszaadja az elemeket az első lépésELŐTT.
SkipUntilaz első lépésUTÁN az összes elemet visszaadja, beleértve az első átadott elemet is.
Hasít
A Split mód két különálló gyűjteményre bontja vagy csoportosítja a gyűjteményelemeket. Azok, amelyek megfelelnek a scriptblock kifejezésnek, és azok, amelyek nem.
Ha a numberToReturn van megadva, az első gyűjtemény tartalmazza az átadott elemeket, és nem haladhatja meg a megadott értéket.
A fennmaradó objektumok, még azok is, amelyek ÁTADJÁK a kifejezésszűrőt, a második gyűjteményben lesznek visszaadva.
$running, $stopped = (Get-Service).Where({$_.Status -eq 'Running'}, 'Split')
$running
Status Name DisplayName
------ ---- -----------
Running Appinfo Application Information
Running AudioEndpointBu... Windows Audio Endpoint Builder
Running Audiosrv Windows Audio
...
$stopped
Status Name DisplayName
------ ---- -----------
Stopped AJRouter AllJoyn Router Service
Stopped ALG Application Layer Gateway Service
Stopped AppIDSvc Application Identity
...
Tömb tagjainak lekérése
Egy tömb tulajdonságainak és metódusainak (például a Length tulajdonság és a SetValue metódus) lekéréséhez használja a Get-Member parancsmag InputObject paraméterét.
Ha egy tömböt Get-Membercsövez, a PowerShell egyenként küldi el az elemeket, és Get-Member a tömb egyes elemeinek típusát adja vissza (figyelmen kívül hagyva az ismétlődéseket).
A -InputObject paraméter használatakor Get-Member a tömb tagjait adja vissza.
Például az alábbi parancs lekéri a $a tömbváltozó tagjait.
Get-Member -InputObject $a
A tömb tagjait úgy is lekérheti, hogy vesszőt (,) ír be a Get-Member parancsmagnak átirányított érték elé. A vessző a tömböt egy olyan tömbökből álló tömb második elemévé teszi. Windows PowerShell egyenként továbbítja a tömböket, és Get-Member visszaadja a tömb tagjait. Mint a következő két példa.
,$a | Get-Member
,(1,2,3) | Get-Member
Egy tömb manipulálása
Módosíthatja a tömb elemeit, hozzáadhat egy elemet egy tömbhöz, és összevonhatja a két tömb értékeit egy harmadik tömbbe.
A tömb egy adott elemének értékének módosításához adja meg a módosítani kívánt elem tömbnevét és indexét, majd a hozzárendelési operátorral (=) adjon meg egy új értéket az elemhez. Ha például a $a tömb második elemének értékét (1. indexpozíció) 10-esre szeretné módosítani, írja be a következőt:
$a[1] = 10
A tömb SetValue metódusával is módosíthat egy értéket. Az alábbi példa a $a tömb második értékét (1. indexpozícióját) 500-ra módosítja:
$a.SetValue(500,1)
A += operátorral hozzáadhat egy elemet egy tömbhöz. Az alábbi példa bemutatja, hogyan adhat hozzá elemet a $a tömbhöz.
$a = @(0..4)
$a += 5
Megjegyzés:
A += operátor használatakor a PowerShell ténylegesen létrehoz egy új tömböt az eredeti tömb értékeivel és a hozzáadott értékkel. Ez teljesítményproblémákat okozhat, ha a művelet többször ismétlődik, vagy a tömb mérete túl nagy.
Nem könnyű elemeket törölni egy tömbből, de létrehozhat egy új tömböt, amely csak egy meglévő tömb kiválasztott elemeit tartalmazza. Ha például a $t tömböt a $a tömb összes elemével szeretné létrehozni, kivéve a 2. indexpozícióban lévő értéket, írja be a következőt:
$t = $a[0,1 + 3..($a.length - 1)]
Ha két tömböt egyetlen tömbbe szeretne egyesíteni, használja a plusz operátort (+). Az alábbi példa két tömböt hoz létre, egyesíti őket, majd megjeleníti az eredményül kapott egyesített tömböt.
$x = 1,3
$y = 5,9
$z = $x + $y
Ennek eredményeként a $z tömb 1, 3, 5 és 9 értéket tartalmaz.
Tömb törléséhez rendeljen hozzá egy $null értéket a tömbhöz. Az alábbi parancs törli a tömböt a $a változóban.
$a = $null
Használhatja a Remove-Item parancsmagot is, de a $null értékének hozzárendelése gyorsabb, különösen nagy tömbök esetén.
Nulla vagy egy elemet tartalmazó tömbök
A Windows PowerShell 3.0-tól kezdődően a nulla vagy egy objektum gyűjteménye rendelkezik a Count and Length tulajdonsággal. Emellett egy objektum tömbjébe is indexelhet. Ez a funkció segít elkerülni azokat a szkriptelési hibákat, amelyek akkor fordulnak elő, ha egy gyűjteményre számított parancs kettőnél kevesebb elemet kap.
Az alábbi példák ezt a funkciót mutatják be.
Nulla objektum
$a = $null
$a.Count
$a.Length
0
0
Egy objektum
$a = 4
$a.Count
$a.Length
$a[0]
$a[-1]
1
1
4
4