【问题标题】:Same array content, giving me different results相同的数组内容,给我不同的结果
【发布时间】:2019-06-15 09:39:48
【问题描述】:

问题摘要

我有两个具有相同内容的变量,唯一的区别是变量的填充方式,当我尝试在交换管理 shell 中使用它时,一个变量出现错误,而另一个变量正常工作。

详细说明 - 附示例

我创建了一个传输规则来阻止来自特定发件人的电子邮件,我正在尝试使用 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,但这不起作用。

我比较了变量类型,它们是相同的。这里发生了什么?我错过了什么

提前感谢您的帮助!

【问题讨论】:

  • 你比较的是数组项类型还是数组? $Collection.GetType() 不会给您与 $Collection[0].GetType() 相同的结果。

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


【解决方案1】:

为了连接两个数组平坦,你必须使用+:

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

注意:由于运算符+只能在表达式中使用,所以整个-from参数必须包含在(...)中。

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

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

相比之下,使用数组值 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 的打印方式来区分它们打印到屏幕,因为隐式输出格式隐式枚举作为单个输入对象接收的数组.

您可以通过使用-Expand CoreOnly 管道到Format-Table 来使差异可见,这会抑制隐式枚举,而是打印任何数组元素本身的属性:

# 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 的底部。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 2017-05-11
    • 2017-10-16
    相关资源
    最近更新 更多