相同的数组内容,给我不同的结果
Same array content, giving me different results
问题摘要
我有两个内容相同的变量,唯一的区别是变量的填充方式,当我尝试在交换管理中使用它时shell我得到一个变量错误,而另一个变量有效应该如此。
详细解释 - 带示例
我创建了一个传输规则来阻止来自特定发件人的电子邮件,我正在尝试使用电源线 shell 将用户添加到阻止列表。
- 我首先尝试使用常规方法来操作数组
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
,但这没有用。
我比较了变量类型,它们是相同的。这里发生了什么?我错过了什么
在此先感谢您的帮助!
为了连接两个数组平坦,你必须使用+
:
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
有关其他信息,请参阅 的底部部分。
问题摘要
我有两个内容相同的变量,唯一的区别是变量的填充方式,当我尝试在交换管理中使用它时shell我得到一个变量错误,而另一个变量有效应该如此。
详细解释 - 带示例
我创建了一个传输规则来阻止来自特定发件人的电子邮件,我正在尝试使用电源线 shell 将用户添加到阻止列表。
- 我首先尝试使用常规方法来操作数组
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
,但这没有用。
我比较了变量类型,它们是相同的。这里发生了什么?我错过了什么
在此先感谢您的帮助!
为了连接两个数组平坦,你必须使用+
:
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
有关其他信息,请参阅