【发布时间】:2011-08-31 11:54:52
【问题描述】:
我想编写一个 cmdlet,从数据库中读取多条记录并将它们放到管道中。
我想我可以做一个单一的WriteObject(Enumerable<rec>, true),或者我可以循环自己并多次调用WriteObject。
这两者有什么区别?
【问题讨论】:
标签: powershell cmdlet
我想编写一个 cmdlet,从数据库中读取多条记录并将它们放到管道中。
我想我可以做一个单一的WriteObject(Enumerable<rec>, true),或者我可以循环自己并多次调用WriteObject。
这两者有什么区别?
【问题讨论】:
标签: powershell cmdlet
这是文档:Cmdlet.WriteObject Method (Object, Boolean)
这是一个例子:
# Writes objects one by one
function Test1
{
[CmdletBinding()]param()
$data | %{ $PSCmdlet.WriteObject($_) }
}
# Writes the collection and allows the core to enumerate it one level.
# Numbers of written objects is the collection item count.
function Test2
{
[CmdletBinding()]param()
$PSCmdlet.WriteObject($data, $true)
}
# Writes the collection as a single object.
# Numbers of written objects is 1.
function Test3
{
[CmdletBinding()]param()
$PSCmdlet.WriteObject($data, $false)
}
function Test
{
(Test1).GetType().Name
(Test2).GetType().Name
(Test3).GetType().Name
}
$data = New-Object System.Collections.ArrayList
Write-Host "1 item"
$null = $data.Add('hello')
Test
Write-Host "2+ items"
$null = $data.Add('world')
Test
输出:
1 item
String
String
ArrayList
2+ items
Object[]
Object[]
ArrayList
因此,为集合中的每个项目调用WriteObject(item) 与WriteObject(items, true) 基本相同;在这两种情况下,集合本身都消失了。
WriteObject(items, false) 不同;它返回对集合的引用,调用者可以根据场景有效地使用它。例如,如果集合是 DataTable 对象(不是 DataRow 项的展开集),则调用者可以对返回对象的 DataTable 成员进行操作。
【讨论】:
好吧,WriteObject(Object, boolean) 将允许您输出一个集合并使其保持不变(如果第二个参数使用“false”调用)。通常,PowerShell 会枚举任何放在管道上的集合。
所以你可以输出一个字符串数组,结果是 [String[]] 类型。而如果让 PowerShell 解包,它将是 [Object[]] 中的字符串数组。
你也可以用“true”来调用这个重载,它就像一个循环调用WriteObject(Object)。
【讨论】: