问题摘要
我有两个内容相同的变量,唯一的区别是变量的填充方式,当我尝试在交换管理外壳中使用它时,我为一个变量得到了一个错误,而另一个变量却按原样工作了。 / p>
详细解释-带有示例
我创建了一种传输规则来阻止来自特定发件人的电子邮件,我试图在Powershell中使用一行添加用户阻止列表。
set-transportrule -identity "whatever" -from @{add="whoever"}
但这是行不通的,我研究了一下,发现它是设计使然的,所以我放弃了。set-transportrule -identity "whatever" -from (get-transportrule -identity "whatever").from,"whoever2"
但是我再次遇到障碍。set-transportrule -identity "whatever" -from "whoever1","whoever2"
,它的运行效果非常好。但这不是我想要添加到现有值中的内容。这让我开始思考,因此我开始测试以发现两个阵列之间的差异
variable1 = "whoever1","whoever2"
,并像这样set-transportrule -identity "whatever" -from $variable1
一样使用它,并按预期方式工作。variable2 = (get-transportrule -identity "whatever").from,"whoever2"
并尝试使用它set-transportrule -identity "whatever" -from $variable2
,但这没用。我比较了变量类型,它们是相同的。这里发生了什么?我想念什么
在此先感谢您的帮助!
答案 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的底部。