В дополнение к Полезный ответ Матиаса Р. Йессена , который хорошо объясняет проблему:
Альтернативой @(...)
является ограничение типа переменная результата с [array]
, помещенная в слева переменной, чтобы гарантировать, что собранный результат будет всегда массивом:
# Ensure that $arrayAfterUnique always contains an array.
[array] $arrayAfterUnique = 1, 1 | Select-Object -Unique
[array]
фактически совпадает с [object[]]
, то есть с обычным массивом PowerShell.
Если вывод команды RHS представляет собой одно значение (скалярное), тозначение теперь автоматически конвертируется в одноэлементный массив;с несколькими выходными значениями массив [object[]]
, неявно созданный PowerShell для сбора выходных данных, сохраняется как есть.
Примечание. Ограничение типа переменной означает, что будущие назначения тоже должны быть заблокированного типаили конвертируемые в него;Например, последующее выполнение $arrayAfterUnique = 42
снова преобразует целое число 42
в одноэлементный массив.
Однако часто не обязательно , чтобы различать скаляры и массивы , поскольку PowerShell позволяет обрабатывать скаляры как * массивы , предоставляя им свойство .Count
со значением 1
и позволяя индексировать с помощью [0]
и [-1]
- см. этот ответ для получения дополнительной информации.
Что касается стороны input :
При отправке массивов в конвейер, PowerShell перечисляет их - то есть элементы отправляются один за другим команде в следующем сегменте конвейера.
Поэтому, однозначное входное значение фактически совпадает с одноэлементным массивом входное значение.
То есть следующие две команды ведут себя одинаково:
# In both cases, Select-Object receives single value '55'
'55' | Select-Object -Unique # single value
@('55') | Select-Object -Unique # single-element array
Если вам нужно убедиться, что массив отправляется в целом в конвейер , pубрать его с помощью ,
(оператор построения массива) [1] :
# Send array 1, 2 as a whole to ForEach-Object
# Note the need for (...) to clarify precedence.
, (1, 2) | ForEach-Object { $_.GetType().Name } # -> 'Object[]'
# Less efficient, but conceptually clearer alternative:
Write-Output -NoEnumerate 1, 2
[1] Это оборачивает массив во вспомогательный одно-вспомогательный массив элементов, и именно этот вспомогательный массив перечисляет PowerShell, поэтому отправляет свой единственный элемент - исходный массив - как есть через конвейер.