Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Редакционная заметка
Важно
Спецификация языка Windows PowerShell 3.0 была опубликована в декабре 2012 года и основана на Windows PowerShell версии 3.0. Эта спецификация не отражает текущее состояние PowerShell. Нет плана обновить эту документацию, чтобы отразить текущее состояние. Эта документация представлена здесь для получения исторической справки.
Документ спецификации доступен в формате документа Microsoft Word из Центра загрузки Майкрософт: https://www.microsoft.com/download/details.aspx?id=36389. Этот документ Word был преобразован для презентации здесь на Microsoft Learn. Во время преобразования некоторые редакционные изменения были внесены в соответствии с форматированием платформы Docs. Исправлены некоторые опечатки и незначительные ошибки.
Введение 9.1
PowerShell поддерживает массивы одного или нескольких измерений с каждым измерением с нулевым или более элементами. В пределах измерения элементы нумеруются по возрастанию целочисленного порядка, начиная с нуля.
Доступ к любому отдельному элементу можно получить с помощью оператора подстрочного массива []
(§7.1.4). Число измерений в массиве называется его рангом.
Элемент может содержать значение любого типа, включая тип массива. Массив, имеющий один или несколько элементов, значения которых имеют любой тип массива, называется зубчатыммассивом. многомерный массив имеет несколько измерений, в этом случае число элементов в каждой строке измерения совпадает. Элемент зубчатого массива может содержать многомерный массив и наоборот.
Многомерные массивы хранятся в основном порядке строк. Число элементов в массиве называется длинойэтого массива, которая фиксируется при создании массива. Таким образом, к элементам в трехмерном массиве длина N можно получить (т. е. подстрочный) с помощью выражений A[0], A[1], ..., A[N-1]
. К элементам в 2-мерном массиве B, содержащем M строк и N столбцов в каждой строке, можно получить доступ с помощью выражений B[0,0], B[0,1], ..., B[0,N-1], B[1,0], B[1,1], ..., B[1,N-1], ..., B[M-1,0], B[M-1,1], ..., B[M-1,N-1]
.
И т. д. для массивов с тремя или более измерениями.
По умолчанию массив полиморфный; т. е. его элементы могут иметь разные типы. Например
$items = 10,"blue",12.54e3,16.30D # 1-D array of length 4
$items[1] = -2.345
$items[2] = "green"
$a = New-Object 'object[,]' 2,2 # 2-D array of length 4
$a[0,0] = 10
$a[0,1] = $false
$a[1,0] = "red"
$a[1,1] = $null
1-мерный массив имеет тип type[]
, 2-мерный массив имеет тип type[,]
, 3-мерный массив имеет тип type[,,]
, и т. д., где тип является объектом для массива неумеренных типов или ограниченного типа для ограниченного массива (§9.4).
Все типы массивов являются производными от массива типов (§4.3.2).
9.2 Создание массива
Массив создается с помощьювыражения создания массива
Ниже приведены некоторые примеры создания и использования массива:
$values = 10, 20, 30
for ($i = 0; $i -lt $values.Length; ++$i) {
"`$values[$i] = $($values[$i])"
}
$x = , 10 # x refers to an array of length 1
$x = @(10) # x refers to an array of length 1
$x = @() # x refers to an array of length 0
$a = New-Object 'object[,]' 2, 2 # create a 2x2 array of anything
$a[0, 0] = 10 # set to an int value
$a[0, 1] = $false # set to a boolean value
$a[1, 0] = "red" # set to a string value
$a[1, 1] = 10.50D # set to a decimal value
foreach ($e in $a) { # enumerate over the whole array
$e
}
В конвейер записывается следующее:
$values[0] = 10
$values[1] = 20
$values[2] = 30
10
False
red
10.50
Начальное значение по умолчанию любого элемента, не явно инициализированного, — это значение по умолчанию для типа этого элемента (то есть, $false
, ноль или $null
).
Объединение массивов 9.3
Массивы произвольного типа и длины можно объединить с помощью +
и +=
операторов, что приводит к созданию нового неограниченного 1-мерного массива. Существующие массивы не изменяются. См. §7.7.3 для получения дополнительной информации и §9.4 для обсуждения вопроса о добавлении в массив ограниченного типа.
9.4 Ограничение типов элементов
Можно создать 1-мерный массив с ограничением по типу, добавив преобразование типа перед выражением создания массива. Например
$a = [int[]](1,2,3,4) # constrained to int
$a[1] = "abc" # implementation-defined behavior
$a += 1.23 # new array is unconstrained
Синтаксис для создания многомерного массива требует спецификации типа, и этот тип становится типом ограничения для этого массива. Однако при указании типа object[]
действительно нет ограничений, так как значению любого типа можно присвоить элемент массива этого типа.
Объединение двух массивов (§7.7.3) всегда приводит к новому массиву, который не ограничен, даже если оба массива ограничены одинаковым типом. Например
$a = [int[]](1,2,3) # constrained to int
$b = [int[]](10,20) # constrained to int
$c = $a + $b # constraint not preserved
$c = [int[]]($a + $b) # result explicitly constrained to int
9.5 Массивы в качестве ссылочных типов
Поскольку типы массивов являются ссылочными типами, переменная, назначающая массив, может ссылаться на любой массив любого ранга, длины и типа элемента. Например
$a = 10,20 # $a refers to an array of length 2
$a = 10,20,30 # $a refers to a different array, of length 3
$a = "red",10.6 # $a refers to a different array, of length 2
$a = New-Object 'int[,]' 2,3 # $a refers to an array of rank 2
Назначение массива включает в себя неглубокое копирование; то есть переменная ссылается на тот же массив, копия массива не создается. Например
$a = 10,20,30
">$a<"
$b = $a # make $b refer to the same array as $a
">$b<"
$a[0] = 6 # change value of [0] via $a
">$a<"
">$b<" # change is reflected in $b
$b += 40 # make $b refer to a new array
$a[0] = 8 # change value of [0] via $a
">$a<"
">$b<" # change is not reflected in $b
В конвейер записывается следующее:
>10 20 30<
>10 20 30<
>6 20 30<
>6 20 30<
>8 20 30<
>6 20 30 40<
9.6 Массивы в виде элементов массива
Любой элемент массива может быть массивом. Например
$colors = "red", "blue", "green"
$list = $colors, (,7), (1.2, "yes") # parens in (,7) are redundant; they
# are intended to aid readability
"`$list refers to an array of length $($list.Length)"
">$($list[1][0])<"
">$($list[2][1])<"
В конвейер записывается следующее:
$list refers to an array of length 3
>7<
>yes<
$list[1]
относится к массиву из 1 элемента, целочисленного 7, доступ к которому осуществляется через $list[1][0]
, как показано ниже. Сравните это со следующим, немного отличающимся случаем:
$list = $colors, 7, (1.2, "yes") # 7 has no prefix comma
">$($list[1])<"
Здесь $list[1]
относится к скалярной, целочисленной 7, доступ к которой осуществляется через $list[1]
.
Рассмотрим следующий пример:
$x = [string[]]("red","green")
$y = 12.5, $true, "blue"
$a = New-Object 'object[,]' 2,2
$a[0,0] = $x # element is an array of 2 strings
$a[0,1] = 20 # element is an int
$a[1,0] = $y # element is an array of 3 objects
$a[1,1] = [int[]](92,93) # element is an array of 2 ints
9.7 Отрицательная подстрока
Это рассматривается в §7.1.4.1.
Проверка границ 9.8
Это рассматривается в §7.1.4.1.
9.9 Срезы массива
срез массива — это неограниченный 1-мерный массив, элементы которого являются копиями нуля или более элементов из коллекции. Срез массива создается с помощью оператора подстрочного []
(§7.1.4.5).
9.10 Копирование массива
Непрерывный набор элементов можно скопировать из одного массива в другой с помощью метода [Array]::Copy
. Например
$a = [int[]](10,20,30)
$b = [int[]](0,1,2,3,4,5)
[Array]::Copy($a, $b, 2) # $a[0]->$b[0],
$a[1]->$b[1]
[Array]::Copy($a, 1, $b, 3, 2) # $a[1]->$b[3],
$a[2]->$b[4]
9.11 Перечисление по массиву
Хотя можно выполнить цикл по массиву, обращаясь к каждому из его элементов через оператор индекса, можно перечислить элементы этого массива с помощью инструкции foreach. Для многомерного массива элементы обрабатываются в основном порядке строк. Например
$a = 10, 53, 16, -43
foreach ($elem in $a) {
# do something with element via $elem
}
foreach ($elem in -5..5) {
# do something with element via $elem
}
$a = New-Object 'int[,]' 3, 2
foreach ($elem in $a) {
# do something with element via $elem
}
9.12 Развёртывание многомерного массива
Некоторые операции с многомерным массивом (например, репликация (§7.6.3) и объединения (§7.7.3)) требуют, чтобы массив был неструктурированным; т. е. для преобразования в 1-мерный массив без ограничений типа. Результирующий массив принимает все элементы в основном порядке строк.
Рассмотрим следующий пример:
$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
Массив, обозначенный как $c
, содержит элементы "красный", $true
, 10, 20, 30 и 40.
PowerShell