【问题标题】:What's the difference between WriteObject(x, true) and multiple writeobjects when writing a PowerShell cmdlet?编写 PowerShell cmdlet 时,WriteObject(x, true) 和多个 writeobjects 有什么区别?
【发布时间】:2011-08-31 11:54:52
【问题描述】:

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

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

这两者有什么区别?

【问题讨论】:

    标签: powershell cmdlet


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      你也可以用“true”来调用这个重载,它就像一个循环调用WriteObject(Object)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-13
        • 1970-01-01
        • 1970-01-01
        • 2011-06-22
        相关资源
        最近更新 更多