使PowerShell认为对象不可枚举

Old*_*art 10 powershell

我一直在研究一些PowerShell函数来管理我们创建的程序集中实现的对象.我一直在使用的类之一实现了IEnumerable.不幸的是,这导致PowerShell在每个机会展开对象.(我无法改变该类实现IEnumerable的事实.)

我通过创建PSObject并将自定义对象的属性复制到PSObject,然后返回而不是自定义对象来解决这个问题.但我真的宁愿返回我们的自定义对象.

是否有某种方法,可能是使用我的types.ps1xml文件,从PowerShell隐藏此类的GetEnumerator()方法(或以其他方式告诉PowerShell永远不会展开它).

Ric*_*ard 8

包裹在一个PSObject可能是最好的方式.

您还可以将其显式地包装在另一个集合中 - PowerShell仅展开一个级别.

另外,在C#/ VB/...中编写cmdlet时,WriteObject使用带有第二个参数的重载:如果为false,则PowerShell不会枚举作为第一个参数传递的对象.


Jay*_*kul 5

查看写输出替换http://poshcode.org/2300,它具有-AsCollection参数,可以避免展开.但基本上,如果您正在编写一个输出集合的函数,并且您不希望该集合展开,则需要使用CmdletBinding和PSCmdlet:

function Get-Array {
    [CmdletBinding()]
    Param([Switch]$AsCollection) 

    [String[]]$data = "one","two","three","four"
    if($AsCollection) {
        $PSCmdlet.WriteObject($data,$false)
    } else {
        Write-Output $data
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你用-AsCollection调用它会得到非常不同的结果,尽管它们会在控制台中看到相同的结果.

C:\PS> Get-Array 

one
two
three
four

C:\PS> Get-Array -AsCollection

one
two
three
four

C:\PS> Get-Array -AsCollection| % { $_.GetType() }


IsPublic IsSerial Name       BaseType                             
-------- -------- ----       --------                             
True     True     String[]   System.Array                         



C:\PS> Get-Array | % { $_.GetType() }


IsPublic IsSerial Name       BaseType                             
-------- -------- ----       --------                             
True     True     String     System.Object                        
True     True     String     System.Object                        
True     True     String     System.Object                        
True     True     String     System.Object   
Run Code Online (Sandbox Code Playgroud)

  • 简单地说:我知道没有办法做到这一点,但请不要尝试:) ...如果你找到一种方法,你最终会导致一堆无法弄清楚为什么你的收藏的错误报告尽管.Count报告了一个很好的大数字,但它没有任何内容. (3认同)