2

我正在创建一个 Powershell System.Management.AutomationCmdlet.Cmdlet ,以通过这种方式将字符串列表通过管道传递给 Cmdlet:

  [Cmdlet(VerbsCommon.Add, "Signature")]
  public class AddSignature : Cmdlet
...
    [Parameter(Position = 0, ValueFromPipeline = true)]
    public List<string> Items { get; set; }
...

现在,在重载的“ProcessRecord”方法中,我一次只能获得一项Items.Count == 13 次(而不是一次通过管道获得完整的列表)。

'item1','item2','item3' | Add-Signature

是否有可能一次传递整个项目列表(由 Get-ChildItem 返回)?我一次只能得到一件物品。

基本上我希望使用管道具有相同的行为,就好像我使用这样的命令(Items.Count == 3

Add-Signature -Items "item1","item2","item3"

任何想法?

4

1 回答 1

1

实际上,我一直在想同样的事情,尽管我的重点是直接从 Powershell 中使用它,而不是在 C# 中。我认为会有一些属性或官方方式来做到这一点。

我看到使用的术语是“停止管道”或有时是缓冲的停止。我能想到有 2 个官方 cmdlet 可以做到这一点:Sort-Object停顿,因为它需要所有对象才能对它们进行排序。Format-Table -Autosize停滞是因为它需要所有对象才能弄清楚如何调整列的大小。

我在 Powershell 中提出了这个解决方法:

function Stall-Pipeline {
[CmdletBinding()]
param(
    [Parameter(
        ValueFromPipeline
    )]
    [String]
    $Msg
)

    Begin {
        Write-Verbose "Begin"
        $all = @()
    }

    Process {
        Write-Verbose "Process"
        $all += $Msg
    }

    End {
        Write-Verbose "End"
        foreach($item in $all) {
            # processing 
            $item # processed item
        }
    }
}

本质上,我正在使用该begin块来初始化一个将保存所有结果的变量。该process块添加到该变量,然后该end块执行所有实际处理并将项目发送到管道。

您可以调用它-Verbose来查看每个块何时被调用。

如果有更好的方法,更官方或支持的方法,我很想知道那是什么。

于 2015-02-04T19:33:47.777 回答