PowerShell转换从函数返回的值。怎么避免这个?

时间:2009-03-29 21:59:28

标签: powershell return-value

我正在尝试返回List< T>来自PowerShell函数,但得到以下之一:

  1. null - 表示空列表
  2. System.Int32 - 包含一个元素的列表
  3. System.Object [] - 包含更多元素的列表
  4. 代码:

    function CreateClrList
    {
        $list = New-Object "System.Collections.Generic.List``1[System.Int32]"
        $list.Add(3)
        $list
    }
    
    Write-Host (CreateClrList).GetType()
    

4 个答案:

答案 0 :(得分:9)

是的,powershell展开所有收藏品。一种解决方案是使用一元逗号返回包含真实集合的集合:

function CreateClrList
{
    $list = New-Object "System.Collections.Generic.List``1[System.Int32]"
    $list.Add(3)
    ,$list
}

答案 1 :(得分:1)

请注意,大多数情况下,您希望 Powershell展开可枚举类型,以便管道命令执行得更快并且具有更早的用户反馈,因为管道下的命令可以开始处理第一项并提供输出

答案 2 :(得分:0)

如果您需要返回整数列表,请使用jachymko's solution

否则,如果你不特别在意你得到的是列表或数组,只想迭代结果,你可以在枚举时将结果包装在@()中,例如

$fooList = CreateClrList
foreach ($foo in @($fooList))
{
    ...
}

这会导致@($fooList)为数组类型 - 空数组,包含一个元素的数组或包含多个元素的数组。

答案 3 :(得分:0)

PowerShell 5.0添加了对类的支持,因此增加了可以指定返回类型的方法。要控制返回的类型,请使用带有静态方法的类:

class ListManager {
    static [System.Collections.Generic.List[int]] Create() {
        [System.Collections.Generic.List[int]] $list =
            [System.Collections.Generic.List[int]]::new()

        $list.Add(3)

        return $list
     }
}

[ListManager]::Create().GetType()