Udostępnij przez


about_Arrays

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. Przedmioty mogą być tego samego typu lub różnych typów.

Począwszy od Windows PowerShell 3.0, kolekcja składająca się z zera lub jednego obiektu 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 oddzielane od nazwy zmiennej operatorem przypisania (=).

Na przykład, aby utworzyć tablicę o nazwie $A zawierającej siedem wartości liczbowych (całkowitych) z liczb 22, 5, 10, 8, 12, 9 i 80, należy wpisać:

$A = 22,5,10,8,12,9,80

Przecinek może być również użyty do zainicjowania tablicy pojedynczego elementu, umieszczając przecinek przed pojedynczym elementem.

Na przykład, aby utworzyć tablicę z pojedynczym elementem o nazwie $B zawierającą pojedynczą wartość 7, należy wpisać:

$B = ,7

Tablicę można również utworzyć i zainicjować za pomocą operatora zakresu (..). W poniższym przykładzie tworzona jest tablica zawierająca wartości od 5 do 8.

$C = 5..8

W rezultacie $C 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 (System.Object[]). Aby określić typ danych tablicy, należy użyć metody GetType() . Na przykład:

$A.GetType()

Aby utworzyć tablicę o jednoznacznie określonym typie, czyli tablicę, która może zawierać tylko wartości określonego typu, rzutuj zmienną jako typ tablicy, taki jak string[], long[] lub int32[]. Aby rzutować tablicę, należy poprzedzić nazwę zmiennej typem tablicy ujętym w nawiasy kwadratowe. Na przykład:

[int32[]]$ia = 1500, 2230, 3350, 4000

W związku z tym tablica $ia może zawierać tylko liczby całkowite.

Można tworzyć tablice, które są rzutowane na dowolny obsługiwany typ na platformie .NET. Na przykład obiekty, które Get-Process są pobierane w celu reprezentowania procesów, są typu System.Diagnostics.Process . Aby utworzyć jednoznacznie określoną tablicę 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ę na podstawie zawartych w niej instrukcji. Niezależnie od tego, co generuje instrukcja wewnątrz operatora, operator umieszcza ją w tablicy. Nawet jeśli nie ma żadnego lub jednego obiektu.

Składnia operatora tablicy jest następująca:

@( ... )

Za pomocą operatora tablicy można utworzyć tablicę składającą się z zera lub jednego obiektu. Na przykład:

$a = @("Hello World")
$a.Count
1
$b = @()
$b.Count
0

Operator tablicy jest przydatny w skryptach, gdy pobierasz obiekty, ale nie wiesz, ile ich oczekiwać. 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 nich

Odczytywanie tablicy

Możesz odwoływać się do tablicy, używając jej nazwy zmiennej. Aby wyświetlić wszystkie elementy w tablicy, wywołaj nazwę tablicy. Na przykład $a jest tablicą liczb od 0 do 9:

$a
0
1
2
3
4
5
6
7
8
9

Możesz odwoływać się do elementów w tablicy za pomocą indeksu. Numer indeksu należy ująć w nawiasy kwadratowe. Wartości indeksów zaczynają się od 0. Aby na przykład wyświetlić pierwszy element w tablicy $a, wpisz:

$a[0]
0

Aby wyświetlić trzeci element w tablicy $a , należy wpisać:

$a[2]
2

Część tablicy można pobrać przy użyciu operatora zakresu dla indeksu. Na przykład, aby pobrać od drugiego do piątego elementu tablicy, należy wpisać:

$a[1..4]
1
2
3
4

Liczby ujemne liczą się od końca tablicy. Na przykład -1 odnosi się do ostatniego elementu tablicy. Aby wyświetlić ostatnie trzy elementy tablicy, w kolejności rosnącej indeksu wpisz:

$a = 0 .. 9
$a[-3..-1]
7
8
9

Jeśli wpiszesz indeksy ujemne w kolejności malejącej, dane wyjściowe ulegną zmianie.

$a = 0 .. 9
$a[-1..-3]
9
8
7

Należy jednak zachować ostrożność podczas korzystania z tej notacji. Notacja przechodzi cyklicznie od granicy końcowej do początku tablicy.

$a = 0 .. 9
$a[2..-2]
2
1
0
9
8

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 przedostatniego elementu w tablicy.

Możesz użyć operatora plus (+), aby połączyć zakresy z listą elementów w tablicy. Na przykład, aby wyświetlić elementy w pozycjach indeksu od 0, 2 i 4 do 6, należy wpisać:

$a = 0 .. 9
$a[0,2+4..6]
0
2
4
5
6

Ponadto, aby wyświetlić listę wielu zakresów i poszczególnych elementów, możesz użyć operatora plus. Na przykład, aby wyświetlić listę elementów od zera do dwóch, od czterech do sześciu i elementu na ósmej pozycji typu:

$a = 0..9
$a[+0..2+4..6+8]
0
1
2
4
5
6
8

Iteracje po elementach tablicy

Możesz również użyć konstrukcji pętli, takich jak foreach, fori while pętle, aby odwoływać się do elementów w tablicy. Na przykład, aby użyć pętli foreach do wyświetlenia elementów w tablicy $a , należy wpisać:

$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 inkrementujesz liczniki podczas badania elementów w tablicy. Na przykład, aby użyć pętli for do zwrócenia każdej innej wartości w tablicy, należy wpisać:

$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 tablicy $a , gdy indeks tablicy jest mniejszy niż 4, należy wpisać:

$a = 0..9
$i=0
while($i -lt 4) {
  $a[$i]
  $i++
}
0
1
2
3

Właściwości tablic

Count lub Length 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 przydatne, jeśli tablica zawiera więcej niż 2 147 483 647 elementów.

$a = 0..9
$a.Count
$a.Length
10
10

Rank

Zwraca liczbę wymiarów w tablicy. Większość tablic w programie PowerShell ma tylko jeden wymiar. Nawet jeśli myślisz, że budujesz tablicę wielowymiarową, jak w poniższym przykładzie:

$a = @(
  @(0,1),
  @("b", "c"),
  @(Get-Process)
)

"`$a rank: $($a.Rank)"
"`$a length: $($a.Length)"
"`$a[2] length: $($a[2].Length)"
"Process `$a[2][1]: $($a[2][1].ProcessName)"

W tym przykładzie tworzona jest tablica jednowymiarowa, która zawiera inne tablice. Jest to również znane jako tablica postrzępiona. Właściwość Rank udowodniła, że jest to jednowymiarowe. Aby uzyskać dostęp do elementów w postrzępionej tablicy, indeksy muszą znajdować się w oddzielnych nawiasach kwadratowych ([]).

$a rank: 1
$a length: 3
$a[2] length: 348
Process $a[2][1]: AcroRd32

Tablice wielowymiarowe są przechowywane w kolejności głównych wierszy. W poniższym przykładzie pokazano, jak utworzyć prawdziwie wielowymiarową tablicę.

[string[,]]$rank2 = [string[,]]::New(3,2)
$rank2.rank
$rank2.Length
$rank2[0,0] = 'a'
$rank2[0,1] = 'b'
$rank2[1,0] = 'c'
$rank2[1,1] = 'd'
$rank2[2,0] = 'e'
$rank2[2,1] = 'f'
$rank2[1,1]
2
6
d

Aby uzyskać dostęp do elementów w tablicy wielowymiarowej, oddziel indeksy przecinkami (,) w jednym zestawie nawiasów kwadratowych ([]).

Niektóre operacje na tablicy wielowymiarowej, takie jak replikacja i konkatenacja, wymagają spłaszczenia tej tablicy. Spłaszczanie zamienia tablicę w tablicę 1-wymiarową typu nieograniczonego. Wynikowa tablica przyjmuje wszystkie elementy według porządku wierszowego. Rozważmy następujący przykład:

$a = "red",$true
$b = (New-Object 'int[,]' 2,2)
$b[0,0] = 10
$b[0,1] = 20
$b[1,0] = 30
$b[1,1] = 40
$c = $a + $b
$a.GetType().Name
$b.GetType().Name
$c.GetType().Name
$c

Dane wyjściowe pokazują, że $c jest to tablica 1-wymiarowa zawierająca elementy z $a i $b w kolejności głównej wiersza.

Object[]
Int32[,]
Object[]
red
True
10
20
30
40

Metody tablic

Clear

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 znajduje się tablica obiektów.

$a = 1, 2, 3
$a.Clear()
$a | % { $null -eq $_ }
True
True
True

W tym przykładzie jest jawnie wpisywany tak, $intA aby zawierał liczby całkowite.

[int[]] $intA = 1, 2, 3
$intA.Clear()
$intA
0
0
0

ForEach()

Pozwala na iterację po wszystkich elementach w tablicy i wykonanie danej operacji dla każdego elementu tablicy.

Metoda ForEach() ma kilka przeciążeń, które wykonują różne operacje.

ForEach(scriptblock expression)
ForEach(scriptblock expression, object[] arguments)
ForEach(type convertToType)
ForEach(string propertyName)
ForEach(string propertyName, object[] newValue)
ForEach(string methodName)
ForEach(string methodName, object[] arguments)

ForEach(wyrażenie bloku skryptu)

ForEach(wyrażenie bloku skryptu, argumenty object[])

Ta metoda została dodana w programie PowerShell w wersji 4.

Uwaga

Składnia wymaga użycia bloku skryptu. Nawiasy są opcjonalne, jeśli blok skryptu jest jedynym parametrem. Ponadto nie może być spacji między metodą a nawiasem otwierającym lub nawiasem klamrowym.

W poniższym przykładzie pokazano, jak używać tej ForEach() metody. W tym przypadku intencją jest wygenerowanie kwadratowej wartości elementów w tablicy.

$a = @(0 .. 3)
$a.ForEach({ $_ * $_})
0
1
4
9

Podobnie jak parametr ArgumentList parametru ForEach-Object, arguments parametr umożliwia przekazanie tablicy argumentów do bloku skryptu skonfigurowanego do ich akceptowania.

Aby uzyskać więcej informacji na temat działania ArgumentList, zobacz about_Splatting.

ForEach(wpisz convertToType)

Metoda ForEach() może być użyta do rzutowania elementów na inny typ; poniższy przykład pokazuje, 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(ciąg właściwościNazwa)

ForEach(ciąg właściwościNazwa, obiekt[] newValue)

Metoda ForEach() może być również używana do 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(ciąg methodName)

ForEach(ciąg methodName, argumenty obiektu)

Na koniec ForEach() metody mogą być używane do wykonywania metody na każdym elemencie w kolekcji.

("one", "two", "three").ForEach("ToUpper")
ONE
TWO
THREE

Podobnie jak parametr ArgumentList parametru ForEach-Object, arguments parametr umożliwia przekazanie tablicy wartości do bloku skryptu skonfigurowanego do ich akceptowania.

Uwaga

Począwszy od programu Windows PowerShell 3.0, pobieranie właściwości i wykonywanie metod dla każdego elementu w kolekcji można również wykonać za pomocą "Metod obiektów skalarnych i kolekcji". Więcej na ten temat przeczytasz tutaj about_Methods.

Gdzie()

Pozwala filtrować lub wybierać elementy tablicy. Skrypt musi dać w wyniku wartość inną niż: zero (0), pusty ciąg $false lub $null aby element był wyświetlany po Where(). Aby uzyskać więcej informacji na temat oceny logicznej, zobacz about_Booleans.

Istnieje jedna definicja tej Where() metody.

Where(scriptblock expression[, WhereOperatorSelectionMode mode
                            [, int numberToReturn]])

Uwaga

Składnia wymaga użycia bloku skryptu. Nawiasy są opcjonalne, jeśli blok skryptu jest jedynym parametrem. Ponadto nie może być spacji między metodą a nawiasem otwierającym lub nawiasem klamrowym.

Jest Expression to blok skryptu, 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.

Wartość mode musi być wartością wyliczeniową WhereOperatorSelectionMode :

  • Default (0) - Zwróć wszystkie przedmioty
  • First (1) — zwraca pierwszy element
  • Last (2) — zwraca ostatni element
  • SkipUntil (3) — pomiń elementy, dopóki warunek nie zostanie spełniony, a następnie zwróć wszystkie pozostałe elementy (w tym pierwszy element, dla którego warunek jest spełniony)
  • Until (4) — zwraca wszystkie elementy, dopóki warunek nie zostanie spełniony
  • Split (5) - Zwraca tablicę dwóch elementów
    • Pierwszy element zawiera pasujące elementy
    • Drugi element zawiera pozostałe elementy

W poniższym przykładzie pokazano, jak wybrać wszystkie liczby nieparzyste z tablicy.

(0..9).Where{ $_ % 2 }
1
3
5
7
9

W tym przykładzie pokazano, jak wybrać ciągi, które nie są puste.

('hi', '', 'there').Where({$_.Length})
hi
there

Default

Tryb Default filtruje elementy za pomocą Expression bloku skryptu.

Jeśli zostanie podany ciąg, numberToReturn określa maksymalną liczbę elementów do zwrotu.

# 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 Default, jak i tryb First zwracają pierwsze (numberToReturn) elementy i mogą być używane zamiennie.

Last

$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 przejdzie filtru wyrażenia bloku skryptu. Następnie zwraca WSZYSTKIE pozostałe elementy kolekcji bez ich testowania. Testowany jest tylko jeden element zaliczony.

Oznacza to, że zwrócona kolekcja zawiera zarówno elementy przekazujące , jak i nieprzekazujące , 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

Until

Tryb Until odwraca tryb.SkipUntil Zwraca wszystkie elementy w kolekcji, dopóki element nie spełni warunku wyrażenia bloku skryptu. Gdy element przekaże wyrażenie scriptblock, Where() metoda przestaje przetwarzać elementy.

Oznacza to, że otrzymasz pierwszy zestaw elementów , które nie przeszły, z metody Where(). Po tym, jak jeden przedmiot przejdzie , reszta NIE jest testowana ani zwracana.

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

Oba Until i SkipUntil działają w oparciu o założenie, że NIE testują partii przedmiotów.

Until zwraca elementy PRZED pierwszym PASS. SkipUntil zwraca wszystkie elementy PO pierwszym przejściu, w tym pierwszy element, który przeszedł.

Split

W Split tym trybie elementy kolekcji są dzielone lub grupowane w dwie osobne kolekcje. Te, które przechodzą wyrażenie scriptblock, i te, które tego nie robią.

Jeśli zostanie określona numberToReturn, to pierwsza kolekcja zawiera , przekazując elementów, które nie powinny przekraczać wartości określonej.

Pozostałe obiekty, nawet te, które PRZEKAZUJĄ filtr wyrażeń, są zwracane 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
...

Uwaga

Obie ForEach() metody są wewnętrznymi Where() elementami członkowskimi. Aby uzyskać więcej informacji na temat wewnętrznych elementów członkowskich, zobacz about_Instrinsic_Members.

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 Get-Member polecenia cmdlet.

Po potokowaniu tablicy do Get-Memberprogramu PowerShell wysyła elementy pojedynczo i Get-Member zwraca typ każdego elementu w tablicy (ignorując duplikaty).

W przypadku użycia parametru Get-Member zwraca elementy członkowskie tablicy.

Na przykład następujące polecenie pobiera składowe zmiennej tablicowej $a .

Get-Member -InputObject $a

Możesz również uzyskać składowe tablicy, wpisując przecinek (,) przed wartością, która jest przesyłana potokiem Get-Member do polecenia cmdlet. Przecinek sprawia, że tablica jest drugim elementem w tablicy tablic. Program PowerShell potokuje tablice pojedynczo i Get-Member zwraca elementy członkowskie tablicy. Podobnie jak w dwóch następnych przykładach.

,$a | Get-Member

,(1,2,3) | Get-Member

Manipulowanie tablicą

Możesz zmienić elementy w tablicy, 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. Na przykład, aby zmienić wartość drugiego elementu w tablicy (pozycja indeksu $a 1) na 10, należy wpisać:

$a[1] = 10

Można również użyć metody SetValue tablicy, aby zmienić wartość. Poniższy przykład zmienia drugą wartość (pozycja indeksu 1) tablicy $a na 500:

$a.SetValue(500,1)

Możesz użyć operatora += , aby dodać element do tablicy. W poniższym przykładzie pokazano, jak dodać element do tablicy $a .

$a = @(0..4)
$a += 5

Uwaga

W przypadku korzystania z operatora += program PowerShell faktycznie tworzy nową tablicę z wartościami oryginalnej tablicy i dodaną wartością. Może to spowodować problemy z wydajnością, jeśli operacja zostanie powtórzona kilka razy lub rozmiar tablicy jest zbyt duży.

Usunięcie elementów z tablicy nie jest łatwe, ale można utworzyć nową tablicę, która zawiera tylko wybrane elementy istniejącej tablicy. Na przykład, aby utworzyć tablicę $t ze wszystkimi elementami w tablicy $a z wyjątkiem wartości o indeksie pozycji 2, należy wpisać:

$t = $a[0,1 + 3..($a.length - 1)]

Aby połączyć dwie tablice w jedną tablicę, użyj operatora plus (+). W poniższym przykładzie tworzone są dwie tablice, łączone je, a następnie wyświetlana jest wynikowa tablica połączona.

$x = 1,3
$y = 5,9
$z = $x + $y

W rezultacie tablica $z zawiera liczby 1, 3, 5 i 9.

Aby usunąć tablicę, przypisz do niej wartość równą $null . Następujące polecenie usuwa tablicę w $a zmiennej.

$a = $null

Można również użyć Remove-Item polecenia cmdlet, ale przypisanie wartości $null jest szybsze, szczególnie w przypadku dużych tablic.

Tablice zero lub jeden

Począwszy od Windows PowerShell 3.0, kolekcja składająca się z zera lub jednego obiektu ma Count właściwości i Length . Możesz także indeksować do tablicy jednego obiektu. Ta funkcja pomaga uniknąć błędów skryptów, które występują, gdy polecenie, które oczekuje, że kolekcja otrzymuje mniej niż dwa elementy.

W poniższym przykładzie pokazano, że zmienna, która nie zawiera żadnych obiektów, ma wartość Count i Length 0.

PS> $a = $null
PS> $a.Count
0
PS> $a.Length
0

W poniższym przykładzie pokazano, że zmienna, która zawiera jeden obiekt, ma wartość Count i Length równą 1. Możesz również użyć indeksowania tablicy, aby uzyskać dostęp do wartości obiektu.

PS> $a = 4
PS> $a.Count
1
PS> $a.Length
1
PS> $a[0]
4
PS> $a[-1]
4

Po uruchomieniu polecenia, które może zwrócić kolekcję lub pojedynczy obiekt, można użyć indeksowania tablicy, aby uzyskać dostęp do wartości obiektu bez konieczności testowania Count właściwości or Length . Jeśli jednak wynikiem jest pojedynczy obiekt (singleton), a ten obiekt ma Count właściwość or Length , wartość tych właściwości należy do obiektu singletona i nie reprezentuje liczby elementów w kolekcji.

W poniższym przykładzie polecenie zwraca pojedynczy obiekt ciągu. Z Length tego ciągu to 4.

PS> $result = 'one','two','three','four' | Where-Object {$_ -like 'f*'}
PS> $result.GetType().FullName
System.String
PS> $result
four
PS> $result.Count
1
PS❯ $result.Length
4

Jeśli chcesz $result być tablicą ciągów, musisz zadeklarować zmienną jako tablicę.

W tym przykładzie $result jest tablicą ciągów. Count i Length tablicy to 1, a Length pierwszego elementu to 4.

PS> [string[]]$result = 'one','two','three','four' |
    Where-Object {$_ -like 'f*'}
PS> $result.GetType().FullName
System.String[]
PS> $result
four
PS> $result.Count
1
PS> $result.Length
1
PS> $result[0].Length
4

Obsługa indeksowania dla systemu.Tuple Obiektów

W programie PowerShell 6.1 dodano obsługę indeksowanego dostępu do Tuple obiektów, podobnie jak w przypadku tablic. Na przykład:

PS> $tuple = [Tuple]::Create(1, 'test')
PS> $tuple[0]
1
PS> $tuple[1]
test
PS> $tuple[0..1]
1
test
PS> $tuple[-1]
test

W przeciwieństwie do tablic i innych obiektów kolekcji, obiekty są traktowane jako pojedynczy obiekt, gdy są przekazywane przez potok lub przez parametry, Tuple które obsługują tablice obiektów.

Aby uzyskać więcej informacji, zobacz System.Tuple.

Indeksowanie typów platformy .NET, które implementują IDictionary<TKey, TValue>

Program PowerShell nie wywołuje prawdziwego indeksatora typu dla typów, które implementują interfejs ogólny IDictionary<TKey, TValue> . Zamiast tego po otrzymaniu klucza program PowerShell testuje istnienie klucza przy użyciu TryGetValue()polecenia , który jest zwracany $null , gdy klucz nie istnieje.

Z drugiej strony, jeśli wywołasz prawdziwy indeksator typu przy użyciu Item(<key>), metoda zgłasza wyjątek, gdy klucz nie istnieje.

Poniższy przykład ilustruje różnicę.

PS> [Collections.Generic.Dictionary[string, int]]::new()['nosuchkey']
# No output ($null)

PS> [Collections.Generic.Dictionary[string, int]]::new().Item('nosuchkey')
GetValueInvocationException: Exception getting "Item": "The given key 'nosuchkey'
 was not present in the dictionary."

Wyliczanie dostępu do elementu członkowskiego

Począwszy od programu PowerShell 3.0, gdy używasz operatora dostępu do elementu członkowskiego w celu uzyskania dostępu do elementu członkowskiego, który nie istnieje w kolekcji list, program PowerShell automatycznie wylicza elementy w kolekcji i próbuje uzyskać dostęp do określonego elementu członkowskiego dla każdego elementu. Aby uzyskać więcej informacji, zobacz about_Member-Access_Enumeration.

Przykłady

W poniższym przykładzie tworzone są dwa nowe pliki i przechowywane są obiekty wynikowe w zmiennej $filestablicowej. Ponieważ obiekt tablicy nie ma elementu członkowskiego LastWriteTime , wartość LastWriteTime jest zwracana dla każdego elementu w tablicy.

$files = (New-Item -Type File -Force '/temp/t1.txt'),
         (New-Item -Force -Type File '/temp/t2.txt')
$files.LastWriteTime
Friday, June 25, 2021 1:21:17 PM
Friday, June 25, 2021 1:21:17 PM

Wyliczenie dostępu do elementu członkowskiego umożliwia pobieranie wartości z elementów w kolekcji, ale nie ustawianie wartości elementów w kolekcji. Na przykład:

$files.LastWriteTime = (Get-Date).AddDays(-1)
InvalidOperation: The property 'LastWriteTime' cannot be found on this object.
Verify that the property exists and can be set.

Aby ustawić wartości, należy użyć metody.

$files.set_LastWriteTime((Get-Date).AddDays(-1))
$files.LastWriteTime
Thursday, June 24, 2021 1:23:30 PM
Thursday, June 24, 2021 1:23:30 PM

Metoda set_LastWriteTime() jest ukrytym elementem członkowskim obiektu FileInfo . W poniższym przykładzie pokazano, jak znaleźć elementy członkowskie, które mają ukrytąset metodę.

$files | Get-Member | Where-Object Definition -like '*set;*'
   TypeName: System.IO.FileInfo

Name              MemberType Definition
----              ---------- ----------
Attributes        Property   System.IO.FileAttributes Attributes {get;set;}
CreationTime      Property   datetime CreationTime {get;set;}
CreationTimeUtc   Property   datetime CreationTimeUtc {get;set;}
IsReadOnly        Property   bool IsReadOnly {get;set;}
LastAccessTime    Property   datetime LastAccessTime {get;set;}
LastAccessTimeUtc Property   datetime LastAccessTimeUtc {get;set;}
LastWriteTime     Property   datetime LastWriteTime {get;set;}
LastWriteTimeUtc  Property   datetime LastWriteTimeUtc {get;set;}

Ostrożność

Ponieważ metoda jest wykonywana dla każdego elementu w kolekcji, należy zachować ostrożność podczas wywoływania metod przy użyciu wyliczania składowych.

Zobacz też