Udostępnij za pośrednictwem


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. Elementy mogą być tego samego typu lub różne typy.

Począwszy od programu 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 (liczb całkowitych) 22, 5, 10, 8, 12, 9 i 80, wpisz:

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

Przecinek może również służyć do inicjowania tablicy pojedynczych elementów przez umieszczenie przecinka przed pojedynczym elementem.

Aby na przykład utworzyć tablicę pojedynczego elementu o nazwie $B zawierającą pojedynczą wartość 7, wpisz:

$B = ,7

Można również utworzyć i zainicjować tablicę przy użyciu operatora zakresu (..). Poniższy przykład tworzy tablicę zawierającą 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, użyj GetType() metody . Na przykład:

$A.GetType()

Aby utworzyć silnie typizowana tablica, oznacza to, że tablica, która może zawierać tylko wartości określonego typu, rzutować zmienną jako typ tablicy, taki jak string[], long[]lub int32[]. Aby rzutować tablicę, poprzedzić nazwę zmiennej typem tablicy ujętą w nawiasach kwadratowych. Na przykład:

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

W rezultacie tablica $ia może zawierać tylko liczby całkowite.

Można tworzyć tablice rzutowane do dowolnego obsługiwanego typu na platformie .NET. Na przykład obiekty pobierane Get-Process do reprezentowania procesów mają typ System.Diagnostics.Process . Aby utworzyć silnie typizowana tablica obiektów procesów, 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 instrukcji w niej. Niezależnie od instrukcji wewnątrz operatora, operator umieszcza go w tablicy. Nawet jeśli istnieje 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:

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

Operator tablicy jest przydatny w skryptach podczas pobierania obiektów, ale nie wiem, ile można 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 ich

Odczytywanie tablicy

Możesz odwołać się do tablicy przy użyciu 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 przy użyciu indeksu. Ujmij numer indeksu w nawiasach kwadratowych. Wartości indeksu 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 , wpisz:

$a[2]
2

Część tablicy można pobrać przy użyciu operatora zakresu dla indeksu. Aby na przykład pobrać drugi do piątych elementów tablicy, należy wpisać:

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

Liczby ujemne z końca tablicy. Na przykład -1 odwołuje 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 zmienią się.

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

Należy jednak zachować ostrożność podczas korzystania z tej notacji. Notacja jest cyklem 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 $a[0..-2] , że odnosi się do wszystkich elementów tablicy, z wyjątkiem ostatniego. Odwołuje się on do pierwszych, ostatnich i ostatnich elementów 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ć wiele zakresów i poszczególnych elementów, możesz 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 pozycji:

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

Iteracji w elementach tablicy

Można również użyć konstrukcji pętli, takich jak foreach, fori while pętle, aby odwoływać się do elementów w tablicy. Aby na przykład użyć foreach pętli 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 jest przydatna for podczas przyrostowania liczników podczas badania elementów w tablicy. Aby na przykład użyć for pętli w celu zwrócenia każdej innej wartości 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ć while pętli, aby wyświetlić elementy w tablicy, dopóki zdefiniowany warunek nie będzie już spełniony. Aby na przykład 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

Countlub lub LengthLongLength

Aby określić, ile elementów znajduje się w tablicy, użyj Length właściwości lub jej Count aliasu. Longlength przydaje się, jeśli tablica zawiera więcej niż 2147 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 uważasz, że tworzysz 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 tworzysz jednowymiarową tablicę zawierającą inne tablice. Jest to również nazywane tablicą postrzępionych. Właściwość Rank udowodniła, że jest to jednowymiarowe. Aby uzyskać dostęp do elementów w tablicy postrzępionej, 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łównej 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, należy oddzielić indeksy przecinkami (,) w jednym zestawie nawiasów kwadratowych ([]).

Niektóre operacje na tablicy wielowymiarowej, takie jak replikacja i łączenie, wymagają spłaszczenia tablicy. Spłaszczanie zamienia tablicę w 1-wymiarową tablicę typu bez ograniczeń. Wynikowa tablica przyjmuje wszystkie elementy w kolejności głównej wiersza. 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 jest tablica obiektów.

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

W tym przykładzie $intA jawnie wpisze się, 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(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 scriptblock)

ForEach(wyrażenie scriptblock, 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 istnieć spacja między metodą a nawiasem otwierającym lub nawiasem klamrowym.

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

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

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

Aby uzyskać więcej informacji na temat zachowania argumentlist, zobacz about_Splatting.

ForEach(typ convertToType)

Metoda ForEach() może służyć do 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 może być również używana do pobierania ForEach() 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)

LastForEach() 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 ArgumentList parametru ForEach-Object, arguments parametr umożliwia przekazywanie tablicy wartości do bloku skryptu skonfigurowanego do ich akceptowania.

Uwaga

Począwszy od programu 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 na ten temat można znaleźć tutaj about_Methods.

Where()

Umożliwia filtrowanie lub wybieranie elementów tablicy. Skrypt musi mieć wartość inną niż: zero (0), ciąg pusty lub $null element, $false który ma być wyświetlany po elemecie Where(). Aby uzyskać więcej informacji na temat oceny logicznej, zobacz about_Booleans.

Istnieje jedna definicja 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 istnieć spacja między metodą a nawiasem otwierającym lub nawiasem klamrowym.

Jest Expression to blok skryptu 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ść musi być wartością mode wyliczeniową WhereOperatorSelectionMode :

  • Default (0) — Zwracanie wszystkich elementów
  • First (1) — zwraca pierwszy element
  • Last (2) — zwraca ostatni element
  • SkipUntil (3) — pomiń elementy, dopóki warunek nie zostanie spełniony, zwróć wszystkie pozostałe elementy (w tym pierwszy element, dla którego warunek ma wartość true)
  • Until (4) — Zwracanie wszystkich elementów do momentu, gdy warunek ma wartość true
  • 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 nieparzyste liczby z tablicy.

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

W następnym przykładzie pokazano, jak wybrać wszystkie niepuste ciągi.

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

Default

Tryb Default filtruje elementy przy użyciu bloku skryptu Expression .

numberToReturn Jeśli element zostanie 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.

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 przekazujący.

Oznacza to, że zwrócona kolekcja 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

Until

Tryb Until odwraca SkipUntil tryb. Zwraca wszystkie elementy w kolekcji, dopóki element nie przekaże wyrażenia bloku skryptu. Gdy element przekazuje wyrażenie scriptblock, Where() metoda zatrzymuje przetwarzanie elementów.

Oznacza to, że otrzymasz pierwszy zestaw elementów innych niż przekazywanie z Where() metody . Po przejściu jednego elementu reszta nie jest testowana lub 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

Zarówno, Until jak i SkipUntil działają w środowisku NIE testowania partii elementów.

Until zwraca elementy PRZED pierwszym przekazywaniem. SkipUntil Zwraca wszystkie elementy PO pierwszym przekazaniu, w tym pierwszy element przekazujący.

Split

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 jest określony, pierwsza kolekcja zawiera elementy przekazujące, które nie przekraczają określonej wartości.

Pozostałe obiekty, nawet te, które przekazują filtr wyrażenia, 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 i Where() są elementami wewnętrznymi. Aby uzyskać więcej informacji na temat elementów wewnętrznych, zobacz about_Instrinsic_Members.

Pobieranie elementów członkowskich tablicy

Aby uzyskać właściwości i metody tablicy, takie jak Length właściwość i metoda SetValue, użyj parametru Get-Member InputObject polecenia cmdlet.

Podczas potoku tablicy do Get-Memberprogramu 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ż pobrać elementy członkowskie tablicy, wpisując przecinek (,) przed wartością potokową 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 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ść (położenie indeksu $a 1) tablicy 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

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 można łatwo usunąć elementów 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 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 z zera lub jednej

Począwszy od programu Windows PowerShell 3.0, kolekcja zero lub jeden obiekt ma Count właściwości 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, dostaje mniej niż dwa elementy.

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

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

W poniższym przykładzie pokazano, że zmienna zawierająca jeden obiekt ma wartość i Count Length 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 lub Length . Jeśli jednak wynik jest pojedynczym obiektem (singleton), a ten obiekt ma Count właściwość lub Length , wartość tych właściwości należy do pojedynczego obiektu i nie reprezentuje liczby elementów w kolekcji.

W poniższym przykładzie polecenie zwraca pojedynczy obiekt ciągu. Wartość 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. Element Count i Length tablicy to 1, a pierwszym Length elementem jest 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

Program PowerShell 6.1 dodał 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 Tuple kolekcji obiekty są traktowane jako pojedynczy obiekt po przekazaniu przez potok lub przez parametry, 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 rzeczywistego indeksatora typu dla typów implementujących interfejs ogólny IDictionary<TKey, TValue> . Zamiast tego w przypadku danego klucza program PowerShell testuje istnienie klucza przy użyciu metody TryGetValue(), która zwraca $null wartość , gdy klucz nie istnieje.

Natomiast jeśli wywołasz prawdziwy indeksator typu przy użyciu Item(<key>)metody , 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."

Wyliczenie dostępu do składowych

Począwszy od programu PowerShell 3.0, gdy używasz operatora 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 w każdym elemencie. Aby uzyskać więcej informacji, zobacz about_Member-Access_Enumeration.

Przykłady

Poniższy przykład tworzy dwa nowe pliki i przechowuje wynikowe obiekty w zmiennej tablicy $files. Ponieważ obiekt tablicy nie ma Lastelementu członkowskiego WriteTime, wartośćLast WriteTime 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 składowych umożliwia pobieranie wartości z elementów w kolekcji, ale nie ustawiania 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źć ukryte set metody.

$files | Get-Member -Force -Name 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;}

Uwaga

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

Zobacz też