О массивах
Краткое описание
Описывает массивы, которые представляют собой структуры данных, предназначенные для хранения коллекций элементов.
Полное описание
Массив — это структура данных, предназначенная для хранения коллекции элементов. Элементы могут быть одного типа или разных типов.
Начиная с Windows PowerShell 3,0, коллекция из нуля или одного объекта имеет некоторые свойства массивов.
Создание и инициализация массива
Чтобы создать и инициализировать массив, присвойте переменной несколько значений. Значения, хранящиеся в массиве, разделяются запятыми и отделены от имени переменной оператором присваивания (=).
Например, чтобы создать массив с именем $A, содержащий семь числовых значений (int), равных 22, 5, 10, 8, 12, 9 и 80, введите:
$A = 22,5,10,8,12,9,80
Можно также создать и инициализировать массив с помощью оператора Range (..). Например, чтобы создать и инициализировать массив с именем "$B", содержащий значения от 5 до 8, введите:
$B = 5..8
В результате $B содержит четыре значения: 5, 6, 7 и 8.
Если тип данных не указан, PowerShell создает каждый массив как массив объектов (тип: System. Object []). Чтобы определить тип данных массива, используйте метод GetType (). Например, чтобы определить тип данных массива $a, введите:
$a.GetType()
Чтобы создать строго типизированный массив, то есть массив, который может содержать только значения определенного типа, приведите переменную к типу массива, например String [], long [] или Int32 []. Для приведения массива перед именем переменной укажите тип массива, заключенный в квадратные скобки. Например, чтобы создать 32-разрядный массив целых чисел с именем $ia, содержащий четыре целых числа (1500, 2230, 3350 и 4000), введите:
[int32[]]$ia = 1500,2230,3350,4000
В результате $ia массив может содержать только целые числа.
Можно создавать массивы, приводимые к любому поддерживаемому типу в Microsoft .NET Framework. Например, объекты, получаемые с помощью Get-Process для представления процессов, имеют тип System. Diagnostics. Process. Чтобы создать строго типизированный массив объектов Process, введите следующую команду:
[Diagnostics.Process[]]$zz = Get-Process
Оператор "часть выражения массива"
Оператор массива Array создает массив, даже если он содержит ноль или один объект.
Синтаксис оператора Array выглядит следующим образом:
@( ... )
Оператор Array можно использовать для создания массива из нуля или одного объекта. Пример:
PS> $a = @("Hello World")
PS> $a.Count
1
PS> $b = @()
PS> $b.Count
0
Оператор Array особенно полезен в скриптах при получении объектов, но неизвестно, сколько объектов вы будете получать. Пример:
$p = @(Get-Process Notepad)
Дополнительные сведения о операторе "часть выражения массива" см. в разделе about_Operators.
Доступ к элементам массива и использование
Чтение массива
Можно ссылаться на массив, используя имя его переменной. Чтобы отобразить все элементы в массиве, введите имя массива. Например, предполагается, что $a
это массив, содержащий целые числа 0, 1, 2, до 9; введите:
$a
0
1
2
3
4
5
6
7
8
9
Можно ссылаться на элементы в массиве с помощью индекса, начиная с позиции 0. Заключите номер индекса в квадратные скобки. Например, чтобы отобразить первый элемент в $a
массиве, введите:
$a[0]
0
Чтобы отобразить третий элемент в $a
массиве, введите:
$a[2]
2
Можно извлечь часть массива с помощью оператора Range для индекса. Например, чтобы получить второй массив для пятого элемента массива, введите:
$a[1..4]
1
2
3
4
Число отрицательных чисел от конца массива. Например, "-1" относится к последнему элементу массива. Чтобы отобразить последние три элемента массива в порядке возрастания, введите:
$a = 0 .. 9
$a[-3..-1]
7
8
9
Если ввести отрицательные индексы в порядке убывания, выходные данные будут изменены.
$a = 0 .. 9
$a[-1..-3]
9
8
7
Однако при использовании этой нотации будьте осторожны. Нотация выполняет цикл от конечной границы до начала массива.
$a = 0 .. 9
$a[2..-2]
2
1
0
9
8
Кроме того, одна из распространенных ошибок состоит в том, чтобы предположить $a[0..-2]
, что ссылается на все элементы массива, за исключением последнего. Он относится к первым, последним и вторым элементам в массиве.
Для объединения диапазонов со списком элементов в массиве можно использовать оператор «плюс» (+). Например, чтобы отобразить элементы с позициями индекса 0, 2 и 4 до 6, введите:
$a = 0 .. 9
$a[0,2+4..6]
0
2
4
5
6
Кроме того, для перечисления нескольких диапазонов и отдельных элементов можно использовать оператор «плюс». Например, для перечисления элементов от 0 до 2, от 4 до шести и элемента в восьмом позиционированном типе:
$a = 0..9
$a[+0..2+4..6+8]
0
1
2
4
5
6
8
Итерации по элементам массива
Можно также использовать циклические конструкции, такие как циклы ForEach, for и while, для ссылки на элементы в массиве. Например, чтобы использовать цикл ForEach для вывода элементов в $a
массиве, введите:
$a = 0..9
foreach ($element in $a) {
$element
}
0
1
2
3
4
5
6
7
8
9
Цикл foreach выполняет итерацию по массиву и возвращает каждое значение в массиве, пока не достигнет конца массива.
Цикл for полезен при увеличении счетчиков при проверке элементов в массиве. Например, чтобы использовать цикл for для возврата всех остальных значений в массиве, введите:
$a = 0..9
for ($i = 0; $i -le ($a.length - 1); $i += 2) {
$a[$i]
}
0
2
4
6
8
Можно использовать цикл while для вывода элементов в массиве до тех пор, пока определенное условие не станет истинным. Например, чтобы отобразить элементы в $a
массиве, если индекс массива меньше 4, введите:
$a = 0..9
$i=0
while($i -lt 4) {
$a[$i];
$i++
}
0
1
2
3
Свойства массивов
Количество или длина или Лонгленгс
Чтобы определить, сколько элементов находится в массиве, используйте Length
свойство или его Count
псевдоним. Longlength
может использоваться, если массив содержит более 2 147 483 647 элементов.
$a = 0..9
$a.Count
$a.Length
10
10
Рейтинг
Возвращает число измерений в массиве. Большинство массивов в PowerShell имеют только одно измерение. Даже если вы считаете, что создаете многомерный массив; как в следующем примере:
$a = @(
@(0,1),
@("b", "c"),
@(Get-Process)
)
[int]$r = $a.Rank
"`$a rank: $r"
$a rank: 1
Создание в PowerShell действительного многомерного массива требует помощи .NET Framework. Как в следующем примере:
[int[,]]$rank2 = [int[,]]::new(5,5)
$rank2.rank
2
Методы массивов
Clear
Устанавливает все значения элементов в значение по умолчанию для типа элемента массива. Метод Clear () не сбрасывает размер массива.
В следующем примере $a
представлен массив объектов.
$a = 1, 2, 3
$a.Clear()
$a | % { $null -eq $_ }
True
True
True
В этом примере $intA
явным образом вводится для хранения целых чисел.
[int[]] $intA = 1, 2, 3
$intA.Clear()
$intA
0
0
0
ForEach
Позволяет перебирать все элементы в массиве и выполнять заданную операцию для каждого элемента массива.
Метод ForEach имеет несколько перегрузок, выполняющих различные операции.
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 (выражение ScriptBlock)
ForEach (выражение ScriptBlock, аргументы объекта [])
Примечание
Синтаксис требует использования блока скрипта. Круглые скобки необязательны.
В следующем примере показано, как использовать метод ForEach. В этом случае целью является создание квадратного значения элементов в массиве.
Обратите внимание, что этот метод был добавлен в PowerShell v4 и недоступен в версиях ниже этого. Для предыдущих версий используйте метод конвейеризации в командлете ForEach-Object.
$a = @(0 .. 3)
$a.ForEach({ $_ * $_})
0
1
4
9
Как и -ArgumentList
параметр параметра ForEach-Object
, arguments
параметр позволяет передавать массив аргументов в блок сценария, настроенный для их принятия.
ForEach (тип Конверттотипе)
ForEach
Метод можно использовать для приведения элементов к другому типу. в следующем примере показано, как преобразовать список строковых дат в [DateTime]
тип.
@("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 (строка propertyName)
ForEach (строка propertyName, объект [] newValue)
ForEach
Метод также можно использовать для быстрого получения или установки значений свойств для каждого элемента в коллекции.
# 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 имя_метода, Object [] аргументы)
Наконец, ForEach
методы можно использовать для выполнения метода для каждого элемента в коллекции.
("one", "two", "three").ForEach("ToUpper")
ONE
TWO
THREE
Как и -ArgumentList
параметр параметра ForEach-Object
, arguments
параметр позволяет передавать массив аргументов в блок сценария, настроенный для их принятия.
Примечание
Начиная с Windows PowerShell 3,0 получение свойств и исполнение методов для каждого элемента в коллекции также можно выполнить с помощью "методов скалярных объектов и коллекций". Дополнительные сведения см. здесь about_methods
Where
Позволяет фильтровать или выбирать элементы массива. Скрипт должен иметь значение, отличное от: ноль (0), пустая строка $false
или, $null
чтобы элемент отображался после элементаWhere
Существует одно определение для Where
метода.
Where(scriptblock expression[, WhereOperatorSelectionMode mode
[, int numberToReturn]])
Expression
Для фильтрации необходим блок ScriptBlock, mode
необязательный аргумент позволяет выбрать дополнительные возможности выбора, а numberToReturn
необязательный аргумент позволяет ограничить количество элементов, возвращаемых фильтром.
Примечание
Синтаксис требует использования блока скрипта. Круглые скобки необязательны.
В следующем примере показано, как выбрать все нечетные числа из массива.
(0..9).Where{ $_ % 2 }
1
3
5
7
9
Доступны следующие режимы выбора.
По умолчанию
Default
Режим фильтрует элементы с помощью Expression
ScriptBlock.
Если numberToReturn
предоставлено значение, оно указывает максимальное число возвращаемых элементов.
# 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)
Примечание
Default
Режим и First
режим возвращают первые numberToReturn
элементы () и могут использоваться взаимозаменяемыми.
Последний
$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
SkipUntil
Режим пропускает все объекты в коллекции до тех пор, пока объект не передаст фильтр выражений блока скрипта. Затем он возвращает все остальные элементы сбора, не проверяя их. Тестируется только одна передача элемента
Это означает, что возвращаемая коллекция будет содержать как передающие , так и непройденные элементы, которые не были проверены.
Количество возвращаемых элементов может быть ограничено путем передачи значения в numberToReturn
аргумент.
$computers = "Server01", "Server02", "Server03", "localhost", "Server04"
# Find the first available online server.
$computers.Where({ Test-Connection $_ }, 'SkipUntil', 1)
localhost
Вплот
Until
Режим инвертирует SkipUntil
режим. Он возвращает все элементы в коллекции, пока элемент не передаст выражение блока скрипта. Когда элемент передает выражение ScriptBlock, Where
метод останавливает обработку элементов.
Это означает, что вы получите первый набор передаваемых элементов из Where
метода. После передачи одного элемента остальное не будет проверяться и не возвращаться.
Количество возвращаемых элементов может быть ограничено путем передачи значения в 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
Примечание
Until
И, и SkipUntil
работают не в ходе тестирования пакета элементов.
Until
Возвращает элементы перед первым прохождением.
SkipUntil
Возвращает все элементы после первого прохода, включая первый передающий элемент.
Split
Split
Режим разделяет или группирует элементы коллекции в две отдельные коллекции. Те, которые передают выражение ScriptBlock, и те, которые не имеют.
Если numberToReturn
указан параметр, то первая коллекция будет содержать передаваемые элементы, а не превышать указанное значение.
Остальные объекты, даже те, которые передают фильтр выражения, будут возвращены во второй коллекции.
$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
...
Получение элементов массива
Чтобы получить свойства и методы массива, такие как свойство Length и метод SetValue, используйте параметр InputObject командлета Get-Member.
При передаче массива в Get-Member
оболочка PowerShell отправляет элементы по одной за раз и Get-Member
возвращает тип каждого элемента в массиве (игнорируя дубликаты).
При использовании параметра -InputObject Get-Member
возвращает элементы массива.
Например, следующая команда возвращает элементы $a
переменной массива.
Get-Member -InputObject $a
Можно также получить члены массива, введя запятую (,) перед значением, перенаправленным в командлет Get-Member. Запятая делает массив вторым элементом массива массивов. Windows PowerShell передает массивы по одному за раз, а Get-Member возвращает элементы массива. Как и в следующих двух примерах.
,$a | Get-Member
,(1,2,3) | Get-Member
Управление массивом
Можно изменить элементы в массиве, добавить элемент в массив и объединить значения из двух массивов в третий массив.
Чтобы изменить значение определенного элемента в массиве, укажите имя массива и индекс элемента, который требуется изменить, а затем используйте оператор присваивания (=), чтобы указать новое значение для элемента. Например, чтобы изменить значение второго элемента в $a
массиве (позиция с индексом 1) на 10, введите:
$a[1] = 10
Для изменения значения можно также использовать метод SetValue массива. Следующий пример изменяет второе значение (позиция индекса 1) $a
массива на 500:
$a.SetValue(500,1)
Для добавления элемента в массив можно использовать оператор + =. В следующем примере показано, как добавить элемент в $a
массив.
$a = @(0..4)
$a += 5
Примечание
При использовании +=
оператора PowerShell фактически создает новый массив со значениями исходного массива и добавленного значения. Это может вызвать проблемы с производительностью, если операция повторяется несколько раз или размер массива слишком велик.
Удалять элементы из массива несложно, но можно создать новый массив, содержащий только выбранные элементы существующего массива. Например, чтобы создать $t
массив со всеми элементами в $a
массиве, за исключением значения в позиции 2 индекса, введите:
$t = $a[0,1 + 3..($a.length - 1)]
Чтобы объединить два массива в один, используйте оператор «плюс» (+). Следующий пример создает два массива, объединяет их, а затем отображает полученный объединенный массив.
$x = 1,3
$y = 5,9
$z = $x + $y
В результате $z
массив содержит 1, 3, 5 и 9.
Чтобы удалить массив, присвойте массиву значение $null. Следующая команда удаляет массив в $a
переменной.
$a = $null
Можно также использовать Remove-Item
командлет, но присваивание значения $null
выполняется быстрее, особенно для больших массивов.
Массивы 0 или 1
Начиная с Windows PowerShell 3,0, коллекция с нулевым или одним объектом имеет свойство Count и length. Кроме того, можно индексировать в массив одного объекта. Эта функция позволяет избежать ошибок скрипта, происходящих, когда команда, ожидающую сбор, получает менее двух элементов.
Эта функция демонстрируется в следующих примерах.
Нуль объектов
$a = $null
$a.Count
$a.Length
0
0
Один объект
$a = 4
$a.Count
$a.Length
$a[0]
$a[-1]
1
1
4
4