Informacje o tablicach
Krótki opis
Opisuje tablice, które są strukturami danych przeznaczonymi do przechowywania kolekcji elementów.
Długi opis
Tablica to struktura danych przeznaczona do przechowywania kolekcji elementów. Elementy mogą być tego samego typu lub różne typy.
Począwszy od Windows PowerShell 3.0, kolekcja zero lub jeden obiekt ma pewne właściwości tablic.
Tworzenie i inicjowanie tablicy
Aby utworzyć i zainicjować tablicę, przypisz wiele wartości do zmiennej. Wartości przechowywane w tablicy są rozdzielane przecinkami i oddzielone od nazwy zmiennej przez operatora przypisania (=).
Aby na przykład utworzyć tablicę o nazwie $A zawierającą siedem wartości liczbowych (int) 22, 5, 10, 8, 12, 9 i 80, wpisz:
$A = 22,5,10,8,12,9,80
Można również utworzyć i zainicjować tablicę przy użyciu operatora zakresu (..). Na przykład aby utworzyć i zainicjować tablicę o nazwie "$B", która zawiera wartości od 5 do 8, wpisz:
$B = 5..8
W rezultacie $B zawiera cztery wartości: 5, 6, 7 i 8.
Jeśli nie określono żadnego typu danych, program PowerShell tworzy każdą tablicę jako tablicę obiektów (typ: System.Object[]). Aby określić typ danych tablicy, użyj metody GetType(). Aby na przykład określić typ danych tablicy $a, wpisz:
$a.GetType()
Aby utworzyć silnie typizowana tablica, czyli tablica, która może zawierać tylko wartości określonego typu, rzutować zmienną jako typ tablicy, taki jak ciąg[], long[] lub int32[]. Aby rzutować tablicę, poprzedzić nazwę zmiennej typem tablicy ujętą w nawiasy kwadratowe. Aby na przykład utworzyć 32-bitową tablicę całkowitą o nazwie $ia zawierającą cztery liczby całkowite (1500, 2230, 3350 i 4000), wpisz:
[int32[]]$ia = 1500,2230,3350,4000
W związku z tym tablica $ia może zawierać tylko liczby całkowite.
Możesz tworzyć tablice rzutowane do dowolnego obsługiwanego typu w .NET Framework firmy Microsoft. Na przykład obiekty, które Get-Process pobiera do reprezentowania procesów, są typu System.Diagnostics.Process. Aby utworzyć silnie typizowana tablica obiektów procesu, wprowadź następujące polecenie:
[Diagnostics.Process[]]$zz = Get-Process
Operator wyrażenia podrzędnego tablicy
Operator wyrażenia podrzędnego tablicy tworzy tablicę, nawet jeśli zawiera zero lub jeden obiekt.
Składnia operatora tablicy jest następująca:
@( ... )
Możesz użyć operatora tablicy, aby utworzyć tablicę zero lub jeden obiekt. Na przykład:
PS> $a = @("Hello World")
PS> $a.Count
1
PS> $b = @()
PS> $b.Count
0
Operator tablicy jest szczególnie przydatny w skryptach podczas pobierania obiektów, ale nie wiem, ile obiektów otrzymasz. Na przykład:
$p = @(Get-Process Notepad)
Aby uzyskać więcej informacji na temat operatora wyrażenia podrzędnego tablicy, zobacz about_Operators.
Uzyskiwanie dostępu do elementów tablicy i korzystanie z ich
Odczytywanie tablicy
Możesz odwołać się do tablicy przy użyciu jej nazwy zmiennej. Aby wyświetlić wszystkie elementy w tablicy, wpisz nazwę tablicy. Załóżmy na przykład, że $a
jest to tablica zawierająca liczby całkowite 0, 1, 2, do 9; wpisując:
$a
0
1
2
3
4
5
6
7
8
9
Można odwoływać się do elementów w tablicy przy użyciu indeksu, zaczynając od pozycji 0. Ujmij numer indeksu w nawiasach kwadratowych. Na przykład aby wyświetlić pierwszy element w tablicy $a
, wpisz:
$a[0]
0
Aby wyświetlić trzeci element w tablicy $a
, wpisz:
$a[2]
2
Część tablicy można pobrać przy użyciu operatora zakresu dla indeksu. Aby na przykład pobrać drugi do piątego elementu tablicy, należy wpisać:
$a[1..4]
1
2
3
4
Liczby ujemne z końca tablicy. Na przykład "-1" odnosi się do ostatniego elementu tablicy. Aby wyświetlić trzy ostatnie elementy tablicy, w kolejności rosnącej indeksu wpisz:
$a = 0 .. 9
$a[-3..-1]
7
8
9
Jeśli wpiszesz ujemne indeksy w kolejności malejącej, dane wyjściowe zmienią się.
$a = 0 .. 9
$a[-1..-3]
9
8
7
Należy jednak zachować ostrożność podczas korzystania z tej notacji. Zapisy są cyklami od granicy końcowej do początku tablicy.
$a = 0 .. 9
$a[2..-2]
2
1
0
9
8
Ponadto jednym z typowych błędów jest założenie, że $a[0..-2]
odnosi się do wszystkich elementów tablicy, z wyjątkiem ostatniego. Odwołuje się on do pierwszego, ostatniego i drugiego do ostatniego elementu w tablicy.
Możesz użyć operatora plus (+), aby połączyć zakresy z listą elementów w tablicy. Aby na przykład wyświetlić elementy na pozycjach indeksu 0, 2 i od 4 do 6, wpisz:
$a = 0 .. 9
$a[0,2+4..6]
0
2
4
5
6
Ponadto, aby wyświetlić listę wielu zakresów i pojedynczych elementów, można użyć operatora plus. Aby na przykład wyświetlić listę elementów zero do dwóch, od czterech do sześciu, a element w ósmym typie pozycyjnym:
$a = 0..9
$a[+0..2+4..6+8]
0
1
2
4
5
6
8
Iteracji nad elementami tablicy
Można również użyć konstrukcji pętli, takich jak ForEach, For i While, aby odwoływać się do elementów w tablicy. Aby na przykład użyć pętli ForEach do wyświetlenia elementów w tablicy $a
, wpisz:
$a = 0..9
foreach ($element in $a) {
$element
}
0
1
2
3
4
5
6
7
8
9
Pętla Foreach iteruje przez tablicę i zwraca każdą wartość w tablicy do momentu osiągnięcia końca tablicy.
Pętla For jest przydatna, gdy zwiększasz liczniki podczas badania elementów w tablicy. Aby na przykład użyć pętli For, aby zwrócić każdą inną wartość w tablicy, wpisz:
$a = 0..9
for ($i = 0; $i -le ($a.length - 1); $i += 2) {
$a[$i]
}
0
2
4
6
8
Możesz użyć pętli While, aby wyświetlić elementy w tablicy, dopóki zdefiniowany warunek nie będzie już spełniony. Na przykład aby wyświetlić elementy w $a
tablicy, gdy indeks tablicy jest mniejszy niż 4, wpisz:
$a = 0..9
$i=0
while($i -lt 4) {
$a[$i];
$i++
}
0
1
2
3
Właściwości tablic
Liczba lub długość lub longLength
Aby określić, ile elementów znajduje się w tablicy, użyj Length
właściwości lub jej Count
aliasu. Longlength
jest przydatna, jeśli tablica zawiera więcej niż 2 147 483 647 elementów.
$a = 0..9
$a.Count
$a.Length
10
10
Ranga
Zwraca liczbę wymiarów w tablicy. Większość tablic w programie PowerShell ma tylko jeden wymiar. Nawet jeśli uważasz, że tworzysz tablicę wielowymiarową; podobnie jak w poniższym przykładzie:
$a = @(
@(0,1),
@("b", "c"),
@(Get-Process)
)
[int]$r = $a.Rank
"`$a rank: $r"
$a rank: 1
Utworzenie prawdziwie wielowymiarowej tablicy w programie PowerShell wymaga pomocy programu .Net Framework. Podobnie jak w poniższym przykładzie:
[int[,]]$rank2 = [int[,]]::new(5,5)
$rank2.rank
2
Metody tablic
Czyste
Ustawia wszystkie wartości elementów na wartość domyślną typu elementu tablicy. Metoda Clear() nie resetuje rozmiaru tablicy.
W poniższym przykładzie $a
jest tablica obiektów.
$a = 1, 2, 3
$a.Clear()
$a | % { $null -eq $_ }
True
True
True
W tym przykładzie typ jest jawnie wpisany, $intA
aby zawierać liczby całkowite.
[int[]] $intA = 1, 2, 3
$intA.Clear()
$intA
0
0
0
ForEach
Umożliwia iterowanie wszystkich elementów tablicy i wykonywanie danej operacji dla każdego elementu tablicy.
Metoda ForEach ma kilka przeciążeń, które wykonują różne operacje.
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(wyrażenie scriptblock)
ForEach(wyrażenie scriptblock, argumenty object[])
Uwaga
Składnia wymaga użycia bloku skryptu. Nawiasy są opcjonalne.
W poniższym przykładzie pokazano, jak używać metody foreach. W takim przypadku intencją jest wygenerowanie wartości kwadratowej elementów w tablicy.
Pamiętaj, że ta metoda została dodana w programie PowerShell w wersji 4 i nie jest dostępna w wersjach poniżej. W przypadku wcześniejszych wersji użyj metody Pipelining do polecenia cmdlet ForEach-Object
$a = @(0 .. 3)
$a.ForEach({ $_ * $_})
0
1
4
9
Podobnie jak parametr parametru -ArgumentList
ForEach-Object
, arguments
parametr umożliwia przekazywanie tablicy argumentów do bloku skryptu skonfigurowanego do ich akceptowania.
ForEach(typ convertToType)
Metoda ForEach
może służyć do szybkiego rzutowania elementów na inny typ. W poniższym przykładzie pokazano, jak przekonwertować listę dat ciągów na [DateTime]
typ.
@("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(string propertyName)
ForEach(string propertyName, object[] newValue)
Metoda ForEach
może być również używana do szybkiego pobierania lub ustawiania wartości właściwości dla każdego elementu w kolekcji.
# 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(string methodName)
ForEach(string methodName, object[] argumenty)
Na koniec ForEach
metody mogą służyć do wykonywania metody na każdym elemencie w kolekcji.
("one", "two", "three").ForEach("ToUpper")
ONE
TWO
THREE
Podobnie jak parametr parametru -ArgumentList
ForEach-Object
, arguments
parametr umożliwia przekazywanie tablicy argumentów do bloku skryptu skonfigurowanego do ich akceptowania.
Uwaga
Począwszy od Windows PowerShell 3.0 pobierania właściwości i wykonywania metod dla każdego elementu w kolekcji można również wykonać przy użyciu "Metody obiektów skalarnych i kolekcji" Więcej informacji o tym można znaleźć tutaj about_methods
Lokalizacja
Umożliwia filtrowanie lub wybieranie elementów tablicy. Skrypt musi mieć wartość inną niż: zero (0), ciąg $false
pusty lub $null
, aby element był wyświetlany po Where
Istnieje jedna definicja Where
metody .
Where(scriptblock expression[, WhereOperatorSelectionMode mode
[, int numberToReturn]])
Element Expression
to scriptblock, który jest wymagany do filtrowania, mode
opcjonalny argument umożliwia dodatkowe możliwości wyboru, a numberToReturn
opcjonalny argument umożliwia ograniczenie liczby elementów zwracanych z filtru.
Uwaga
Składnia wymaga użycia bloku skryptu. Nawiasy są opcjonalne.
W poniższym przykładzie pokazano, jak wybrać wszystkie nieparzyste liczby z tablicy.
(0..9).Where{ $_ % 2 }
1
3
5
7
9
Dostępne są następujące tryby wyboru.
Default
Tryb Default
filtruje elementy przy użyciu blokady skryptu Expression
.
numberToReturn
Jeśli element jest podany, określa maksymalną liczbę elementów do zwrócenia.
# 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)
Uwaga
Zarówno tryb, jak Default
i First
tryb zwracają pierwsze (numberToReturn
) elementy i mogą być używane zamiennie.
Ostatnie
$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)
SkipUntil
Tryb SkipUntil
pomija wszystkie obiekty w kolekcji, dopóki obiekt nie przekaże filtru wyrażeń blokowych skryptu. Następnie zwraca wszystkie pozostałe elementy kolekcji bez ich testowania. Testowany jest tylko jeden element przekazujący
Oznacza to, że zwrócona kolekcja będzie zawierać zarówno elementy przekazujące , jak i niezlecane , które nie zostały przetestowane.
Liczba zwracanych elementów może być ograniczona przez przekazanie wartości do argumentu numberToReturn
.
$computers = "Server01", "Server02", "Server03", "localhost", "Server04"
# Find the first available online server.
$computers.Where({ Test-Connection $_ }, 'SkipUntil', 1)
localhost
Do
Tryb Until
odwraca SkipUntil
tryb. Zwraca wszystkie elementy w kolekcji, dopóki element nie przekaże wyrażenia bloku skryptu. Gdy element przekaże wyrażenie scriptblock, Where
metoda przestanie przetwarzać elementy.
Oznacza to, że otrzymasz pierwszy zestaw elementów innych niż przekazywanie z Where
metody . Po przejściu jednego elementu reszta nie zostanie przetestowana ani zwrócona.
Liczba zwracanych elementów może być ograniczona przez przekazanie wartości do argumentu numberToReturn
.
# 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
Uwaga
Zarówno Until
, jak i SkipUntil
działają w środowisku NIE testowania partii elementów.
Until
Metoda zwraca elementy PRZED pierwszym przekazaniem.
SkipUntil
Zwraca wszystkie elementy PO pierwszym przekazaniu, w tym pierwszy element przekazujący.
Podział
Tryb Split
dzieli elementy kolekcji lub grupuje je na dwie oddzielne kolekcje. Te, które przekazują wyrażenie scriptblock, i te, które nie.
numberToReturn
Jeśli element zostanie określony, pierwsza kolekcja będzie zawierać elementy przekazujące, aby nie przekraczać określonej wartości.
Pozostałe obiekty, nawet te, które przekazują filtr wyrażenia, zostaną zwrócone w drugiej kolekcji.
$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
...
Pobieranie elementów członkowskich tablicy
Aby uzyskać właściwości i metody tablicy, takie jak właściwość Length i metoda SetValue, użyj parametru InputObject polecenia cmdlet Get-Member.
Podczas potoku tablicy do Get-Member
programu Program PowerShell wysyła elementy pojedynczo i Get-Member
zwraca typ każdego elementu w tablicy (ignorując duplikaty).
Gdy używasz parametru -InputObject , Get-Member
zwraca elementy członkowskie tablicy.
Na przykład następujące polecenie pobiera elementy członkowskie zmiennej $a
tablicy.
Get-Member -InputObject $a
Możesz również uzyskać elementy członkowskie tablicy, wpisując przecinek (,) przed wartością, która jest kreskowana potokiem do polecenia cmdlet Get-Member. Przecinek sprawia, że tablica jest drugim elementem w tablicy tablic. Windows PowerShell potokuje tablice pojedynczo, a Get-Member zwraca elementy członkowskie tablicy. Podobnie jak w przypadku dwóch następnych przykładów.
,$a | Get-Member
,(1,2,3) | Get-Member
Manipulowanie tablicą
Elementy w tablicy można zmienić, dodać element do tablicy i połączyć wartości z dwóch tablic w trzecią tablicę.
Aby zmienić wartość określonego elementu w tablicy, określ nazwę tablicy i indeks elementu, który chcesz zmienić, a następnie użyj operatora przypisania (=), aby określić nową wartość elementu. Aby na przykład zmienić wartość drugiego elementu w $a
tablicy (pozycja indeksu 1) na 10, wpisz:
$a[1] = 10
Możesz również użyć metody SetValue tablicy, aby zmienić wartość. Poniższy przykład zmienia drugą wartość (pozycja indeksu $a
1) tablicy na 500:
$a.SetValue(500,1)
Aby dodać element do tablicy, możesz użyć operatora +=. W poniższym przykładzie pokazano, jak dodać element do tablicy $a
.
$a = @(0..4)
$a += 5
Uwaga
Gdy używasz +=
operatora, program PowerShell faktycznie tworzy nową tablicę z wartościami oryginalnej tablicy i wartością dodaną. Może to spowodować problemy z wydajnością, jeśli operacja jest powtarzana kilka razy lub rozmiar tablicy jest zbyt duży.
Nie jest łatwo usuwać elementy z tablicy, ale można utworzyć nową tablicę zawierającą tylko wybrane elementy istniejącej tablicy. Aby na przykład utworzyć tablicę $t
ze wszystkimi elementami w $a
tablicy z wyjątkiem wartości na pozycji indeksu 2, wpisz:
$t = $a[0,1 + 3..($a.length - 1)]
Aby połączyć dwie tablice w jedną tablicę, użyj operatora plus (+). Poniższy przykład tworzy dwie tablice, łączy je, a następnie wyświetla wynikową połączoną tablicę.
$x = 1,3
$y = 5,9
$z = $x + $y
W rezultacie tablica $z
zawiera wartości 1, 3, 5 i 9.
Aby usunąć tablicę, przypisz wartość $null do tablicy. Następujące polecenie usuwa tablicę w zmiennej $a
.
$a = $null
Możesz również użyć Remove-Item
polecenia cmdlet , ale przypisywanie wartości $null
jest szybsze, szczególnie w przypadku dużych tablic.
Tablice o wartości zero lub jednej
Począwszy od Windows PowerShell 3.0, kolekcja zero lub jeden obiekt ma właściwość Count i Length. Ponadto można indeksować do tablicy jednego obiektu. Ta funkcja pomaga uniknąć błędów skryptów występujących, gdy polecenie, które oczekuje kolekcji, otrzymuje mniej niż dwa elementy.
W poniższych przykładach pokazano tę funkcję.
Zero obiektów
$a = $null
$a.Count
$a.Length
0
0
Jeden obiekt
$a = 4
$a.Count
$a.Length
$a[0]
$a[-1]
1
1
4
4