Select-Object -Unique返回String而不是String数组

这种情况仅与长度为1的数组一起出现。

示例:

$array = @("55") 
$arrayAfterUnique = $array | Select-Object -Unique 

所以我希望$arrayAfterUnique是长度为1的数组。
但是,Select-Object将从中产生一个字符串。

是否有解决此问题的简便方法?

Lephia 回答:Select-Object -Unique返回String而不是String数组

  

但是Select-Object会用它做成一个字符串

不太完全-Select-Object将返回0个或多个对象,PowerShell运行时将根据结果决定是否将结果存储为标量或数组。

通过使用数组子表达式运算符@(),无论输出中有多少个对象,您都可以强制结果为数组:

$array = @("55") 
$arrayAfterUnique = @($array | Select-Object -Unique)
,

您可以添加自定义函数以转换为数组as shown here

function ToArray
{
  begin
  {
    $output = @()
  }
  process
  {
    $output += $_
  }
  end
  {
    return,$output
  }
}

用法:

$array = @("55") 
$arrayAfterUnique = $array | Select-Object -Unique | ToArray
$arrayAfterUnique.GetType() # Returns System.Array

更新

值得一提的是,由于使用+-,因此为每个项目创建一个新数组时,此方法可能会导致性能下降。

,

补充Mathias R. Jessen's helpful answer,这可以很好地说明问题:

@(...)的替代方法是 type-constrain 将结果变量[array] 置于 left 变量,以确保收集的结果总是 一个数组:

# Ensure that $arrayAfterUnique always contains an array.
[array] $arrayAfterUnique = 1,1 | Select-Object -Unique 

[array]实际上与[object[]]相同,即常规的PowerShell数组。

如果RHS命令的输出是单个值(标量),则该值现在会自动转换为单元素数组;具有多个输出值,PowerShell隐式创建的用于收集输出的[object[]]数组按原样存储。

注意:对变量进行类型约束意味着将来的分配也必须是锁定类型或可转换为锁定类型;例如,稍后执行$arrayAfterUnique = 42再次将整数42转换为单元素数组。

但是,通常不需要 区分标量和数组,因为PowerShell通过给定标量,使您可以像对待标量 那样对待标量具有值.Count的{​​{1}}属性,并允许使用1[0]进行索引-有关更多信息,请参见this answer


对于 input 端:

在将数组发送到到管道时,PowerShell 枚举它们-也就是说,元素被一个接一个地发送到下一个管道段中的命令。

因此,单值输入实际上与单元素数组输入相同。

也就是说,以下两个命令的行为相同:

[-1]

如果您需要确保将数组整体发送给管道 ,请在其前面加上# In both cases,Select-Object receives single value '55' '55' | Select-Object -Unique # single value @('55') | Select-Object -Unique # single-element array (数组构造运算符) [1] :

,

[1]这会将数组包装在一个辅助单元素助手数组中,PowerShell枚举的是该助手数组,因此按原样通过管道发送其唯一的元素-原始数组。

本文链接:https://www.f2er.com/3166113.html

大家都在问