c# - Cmdlet 通过管道一次传递参数列表,而不是单个列表项

标签 c# powershell pipeline powershell-cmdlet

我正在创建一个 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 == 1 3 次(而不是通过管道一次获取完整列表)。

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

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

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

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

有什么想法吗?

最佳答案

实际上我一直在想同样的事情,尽管我的重点是直接从 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 block 来初始化一个将保存所有结果的变量。 process block 添加到该变量,然后 end block 执行所有实际处理并将项目发送到管道。

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

如果有更好的方式、更官方或受支持的方式,我非常想知道那是什么。

关于c# - Cmdlet 通过管道一次传递参数列表,而不是单个列表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28319751/

相关文章:

c# - 如何获取 IFormatProvider 的文化

c# - Entity Framework 存储过程 - 映射复杂属性

powershell - 添加基于注释的帮助中断动态参数的获取帮助

python - 是否可以切换 sklearn 管道中的某个步骤?

javascript - 在 asp.net 中隐藏更新面板中的 div

c# - F# 和 WCF 消耗

powershell:导入模块时运行代码

PowerShell 功能和性能

c++ - 如何在 C++ 中模拟 5 级流水线?

go - GO 应用程序在管道中时如何提示用户输入