编写PowerShell cmdlet时,WriteObject(x,true)和多个writeobject之间有什么区别?

时间:2011-05-23 21:40:42

标签: powershell cmdlet

我想编写一个cmdlet,它从数据库中读取多个记录并将它们放到管道上。

我想我可以做一个WriteObject(Enumerable<rec>, true)或者我可以自己循环并多次拨打WriteObject

这两者之间有什么区别?

2 个答案:

答案 0 :(得分:3)

以下是文档: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成员进行操作。

答案 1 :(得分:1)

好吧,WriteObject(Object, boolean)将允许您输出一个集合并让它保持原样(如果第二个参数调用“false”)。通常,PowerShell将枚举任何放在管道上的集合。

所以你可以输出一个字符串数组,结果是[String []]类型。如果你让PowerShell解包它,它将是[Object []]中的一个字符串数组。

您也可以使用“true”调用该重载,它就像一个调用WriteObject(Object)的循环。