【发布时间】:2019-10-24 20:01:34
【问题描述】:
我尝试在 Powershell 中创建一个包含多个元素的数组。其中一个元素应该是由另一个数组的元素组成的以逗号分隔的字符串。我尝试使用此代码:
$list = @("a","b")
$result = @("1 " + $list -join ",", "2")
我希望$result 是一个由两个元素组成的数组:1 a,b 和2。但实际上,它是一个由单个元素 1 a b 组成的数组。
这个问题可以通过添加这样的括号来解决:
$result = @(("1 " + $list -join ","), "2")
看Powershell Operator Precedence,, 似乎优先于串联,所以这两行在优先级方面是相同的
$result = @("1 " + $list -join ",", "2")
$result = @("1 " + $list -join (",", "2"))
很明显,join 运算符接收一个字符串列表作为其参数。根据documentation,join 只需要一个参数。
我的问题是:
join如何处理这个参数?为什么它不抛出错误?
【问题讨论】:
-
[string] (",", "2")->, 2。为什么将数组转换为字符串会产生其元素的空格分隔版本?嗯,就是这样。作为一种脚本语言,PowerShell 通常不会产生错误,如果它也可以做一些模糊有用的事情。所以你得到的实际上是("1 " + $list) -join ", 2",它是一个只有一个元素的join,它给出了输入("1 " + [string] $list),正如前面提到的那样,它减少到"1 a b"。 -
要真正得到你想要的,你需要
@(("1 " + ($list -join ",")), "2")。看起来加了括号,但实际上不是。 -
另外,
[string]$list是空格分隔的字符串的原因是因为这是默认行为。$OFS自动变量控制该设置。设置$OFS = ';'将产生分号分隔的字符串。
标签: powershell