数组内容相同,给我不同的结果

时间:2019-01-21 23:58:45

标签: powershell exchange-server exchange-server-2010

问题摘要

我有两个内容相同的变量,唯一的区别是变量的填充方式,当我尝试在交换管理外壳中使用它时,我为一个变量得到了一个错误,而另一个变量却按原样工作了。 / p>

详细解释-带有示例

我创建了一种传输规则来阻止来自特定发件人的电子邮件,我试图在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 :(得分:2)

串联两个数组平坦,必须使用+

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

注意:由于运算符+仅可用于表达式,因此整个-from自变量必须包含在(...)中。

相反,<array>, <scalar>创建一个 2元素数组,其第一个元素为<array>,第二个元素为<scalar>,这不是您的意图。

,是PowerShell的数组构造运算符,它创建一个数组,其中每个操作数都按原样成为数组元素 ,无论给定的操作数是标量还是数组。 / p>

与之相反,对于数组值LHS,+ 将LHS和RHS连接起来,方法是将RHS元素作为附加元素附加到LHS(这会隐式创建一个 new 数组,因为数组是固定大小的。)


一个简化的示例:

$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

有关其他信息,请参见this answer的底部。