gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:11:41 27 4
gpt4 key购买 nike

我正在创建一个 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com