【问题标题】:How can I stop Powershell filtering from converting my array to string?如何阻止 Powershell 过滤将我的数组转换为字符串?
【发布时间】:2021-04-26 20:49:51
【问题描述】:

观察这个例子:

PS C:\> $list=("A","B")
PS C:\> $list.GetType().Name
Object[]
PS C:\> ($list | ? {$_ -ne "C"}).GetType().Name
Object[]
PS C:\> ($list | ? {$_ -ne "B"}).GetType().Name
String

为什么当只剩下一个元素时,Powershell 将我的数组转换为字符串?它破坏了我脚本中变量的进一步处理,我假设输出是一个数组。如何预防?

【问题讨论】:

  • 强制它是一个带有@(..)的数组
  • 我将第 1 行更改为 $list=@("A","B"),但这并没有帮助。
  • 啊,@($list | ? {$_ -ne "B"}).GetType().Name 有效。把它写成答案,我会接受它

标签: powershell


【解决方案1】:

解释一下为什么Powershell看似将数组转换为字符串是Where-Object / %的过滤结果和它返回的数据造成的。

当第一个版本过滤不等于“C”的元素时,结果是一个集合。匹配的成员不止一个:“A”和“B”。因此,需要一个集合来包含这两个值。

第二个版本只返回一个对象“A”,因此它是一个字符串而不是一个集合。由于只有一个对象,因此无需返回包含一个元素的数组 - 只需返回对象本身。

Theo 的答案是将Where-Object 的输出设为一个数组。 array sub-expression operator @() 可用于创建数组。像这样,

# Convert where-object's output into an array,
# even if there is only a single object.
@($list | ? {$_ -ne "B"}) 

【讨论】:

  • 能否请您将 Theo 的答案作为您自己的答案,以便人们在访问此问题时无需查找参考资料?
【解决方案2】:

补充我的评论和vonPryz's answer

当从函数或脚本块返回单个标量(在本例中为字符串)时,PowerShell 会“解开”单元素数组。

为了防止它干扰需要数组的其余代码,无论它是空的还是只有一个元素,您可以通过将其包装在 @() 中来强制输出成为一个数组。

在你的情况下,

($list | ? {$_ -ne "B"})

将返回单个元素A,变成一个标量String,而

@($list | ? {$_ -ne "B"}).GetType().Name

返回一个数组 (Object[]),其中只有一个元素。

【讨论】:

    猜你喜欢
    • 2017-11-07
    • 2018-09-03
    • 1970-01-01
    • 2014-10-08
    • 2021-12-13
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 2021-06-12
    相关资源
    最近更新 更多