【问题标题】:Argument ignored in PowershellPowershell 中忽略的参数
【发布时间】:2019-10-24 20:01:34
【问题描述】:

我尝试在 Powershell 中创建一个包含多个元素的数组。其中一个元素应该是由另一个数组的元素组成的以逗号分隔的字符串。我尝试使用此代码:

$list = @("a","b")
$result =  @("1 " + $list -join ",", "2")

我希望$result 是一个由两个元素组成的数组:1 a,b2。但实际上,它是一个由单个元素 1 a b 组成的数组。

这个问题可以通过添加这样的括号来解决:

$result = @(("1 " + $list -join ","), "2")

Powershell Operator Precedence, 似乎优先于串联,所以这两行在优先级方面是相同的

$result =  @("1 " + $list -join ",", "2")
$result =  @("1 " + $list -join (",", "2"))

很明显,join 运算符接收一个字符串列表作为其参数。根据documentationjoin 只需要一个参数。

我的问题是:

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


【解决方案1】:

传递给右侧 -join 运算符的数组被强制转换为字符串。没想到你能做到。

[string](1,2)
1 2

'a','a' -join 4,5,6
a4 5 6a

我不确定为什么 cmdlet 参数的行为会有所不同。 -filter 参数是字符串类型。

get-childitem -filter *.txt,*.ps1
Get-ChildItem : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Filter'. Specified method is not supported.

在这个例子中数组变成了一个字符串:

& { param([string]$a) $a } 1,2,3
1 2 3

顺便说一句,创建数组需要@() 是一个神话。逗号就够了。

$list = 'a','b'
$result = ('1 ' + $list -join ','),'2' 
$result
1 a b
2

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 2020-04-25
    相关资源
    最近更新 更多