我一直在研究一些PowerShell函数来管理我们创建的程序集中实现的对象.我一直在使用的类之一实现了IEnumerable.不幸的是,这导致PowerShell在每个机会展开对象.(我无法改变该类实现IEnumerable的事实.)
我通过创建PSObject并将自定义对象的属性复制到PSObject,然后返回而不是自定义对象来解决这个问题.但我真的宁愿返回我们的自定义对象.
是否有某种方法,可能是使用我的types.ps1xml文件,从PowerShell隐藏此类的GetEnumerator()方法(或以其他方式告诉PowerShell永远不会展开它).
包裹在一个PSObject可能是最好的方式.
您还可以将其显式地包装在另一个集合中 - PowerShell仅展开一个级别.
另外,在C#/ VB/...中编写cmdlet时,WriteObject使用带有第二个参数的重载:如果为false,则PowerShell不会枚举作为第一个参数传递的对象.
查看写输出替换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)
| 归档时间: |
|
| 查看次数: |
985 次 |
| 最近记录: |