Одинаковое содержимое массива, что дает разные результаты - PullRequest
0 голосов
/ 22 января 2019

Краткое описание вопроса

У меня есть две переменные с одинаковым содержимым, единственная разница в том, как эта переменная была заполнена, когда я пытаюсь использовать ее в оболочке управления обменом, я получаю для одной переменной ошибку, в то время как другая работает так, как должно быть.

Длинное объяснение - с примерами

Я создал правило транспорта для блокировки электронных писем от определенных отправителей, я пытаюсь использовать одну строку в powershell для добавления пользователей в черный список.

  1. Сначала я попробовал обычный способ манипулировать массивом, используя set-transportrule -identity "whatever" -from @{add="whoever"} Но это не работает, я исследовал это и увидел, что это сделано специально, поэтому я отказался от этого.
  2. Так что я попробовал что-то еще set-transportrule -identity "whatever" -from (get-transportrule -identity "whatever").from,"whoever2" Но я снова врезался в блокпост.
  3. Так попробовал set-transportrule -identity "whatever" -from "whoever1","whoever2" и все заработало прекрасно. Но это не то, что я хочу, я пытаюсь добавить к существующим значениям.

Это заставило меня задуматься, поэтому я начал тестирование, чтобы найти различия между двумя массивами

  1. Сначала я создал переменную variable1 = "whoever1","whoever2" и использовал ее вот так set-transportrule -identity "whatever" -from $variable1, и она работала в порядке.
  2. Итак, я создал другую переменную variable2 = (get-transportrule -identity "whatever").from,"whoever2" и попытался использовать ее set-transportrule -identity "whatever" -from $variable2, но это не сработало.

Я сравнил типы переменных, и они идентичны. Что тут происходит? Чего мне не хватает

Заранее спасибо за любую помощь!

1 Ответ

0 голосов
/ 22 января 2019

Чтобы объединить два массива категорически , необходимо использовать +:

set-transportrule -identity "whatever" `
                  -from ((get-transportrule -identity "whatever").from + "whoever2")

Примечание. Поскольку оператор + может использоваться только в выражении , весь аргумент -from должен быть заключен в (...).

Напротив, <array>, <scalar> создает массив 2-элементный , чей 1-й элемент <array>, а 2-й элемент <scalar>, что не является вашим намерением.

,, который является оператором построения массива PowerShell, создает массив, каждый операнд становится элементом массива как есть , независимо от того, является ли данный операнд скалярным или массивом.

В отличие от этого, с помощью LHS со значением массива + объединяет LHS и RHS, добавляя элемент (ы) RHS в качестве дополнительных элементов в LHS (что неявно создает новый массив , учитывая, что массивы имеют фиксированный размер).


Упрощенный пример:

$arr = 1, 2   # input array
$scalar = 3   # scalar to append

# INCORRECT: Creates *nested* array.
($arr, $scalar).Count # -> 2(!); [0] of the new array contains $arr, [1] $scalar
# Same as: (1, 2), 3

# CORRECT: Creates *flat* array.
($arr + $scalar).Count # -> 3
# Same as: (1, 2) + 3 == 1, 2, 3

Обратите внимание, что вы не можете отличить $arr, $scalar от $arr + $scalar по тому, как они выводят на экран , потому что неявное форматирование вывода неявно перечисляет массив, полученный как один входной объект.

Вы можете сделать разницу видимой, передав по трубопроводу Format-Table с -Expand CoreOnly, который подавляет неявное перечисление и вместо этого печатает свойства любого элемента массива:

# Flat array: prints as expected.
PS> $arr + $scalar | Format-Table -Expand CoreOnly
1
2
3

# Array with sub-arrays: output reveals the presence of subarrays
PS> $arr, $scalar | Format-Table -Expand CoreOnly

Length LongLength Rank SyncRoot IsReadOnly IsFixedSize IsSynchronized Count
------ ---------- ---- -------- ---------- ----------- -------------- -----
     2          2    1 {1, 2}        False        True          False     2
3

Для получения дополнительной информации см. Нижний раздел этого ответа .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...