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

Same array content, giving me different results

问题摘要

我有两个内容相同的变量,唯一的区别是变量的填充方式,当我尝试在交换管理中使用它时shell我得到一个变量错误,而另一个变量有效应该如此。

详细解释 - 带示例

我创建了一个传输规则来阻止来自特定发件人的电子邮件,我正在尝试使用电源线 shell 将用户添加到阻止列表。

  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,但这没有用。

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

在此先感谢您的帮助!

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

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

有关其他信息,请参阅 的底部部分。