Udostępnij za pośrednictwem


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 -ArgumentListForEach-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 -ArgumentListForEach-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-Memberprogramu 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

Zobacz też