C# Cmdlet通过管道一次性传递参数列表,而不是单个列表项
我正在创建PowershellC# Cmdlet通过管道一次性传递参数列表,而不是单个列表项,c#,powershell,pipeline,cmdlet,pscmdlet,C#,Powershell,Pipeline,Cmdlet,Pscmdlet,我正在创建PowershellSystem.Management.AutomationCmdlet.Cmdlet,用于通过管道将字符串列表传递给Cmdlet,方法如下: [Cmdlet(VerbsCommon.Add, "Signature")] public class AddSignature : Cmdlet ... [Parameter(Position = 0, ValueFromPipeline = true)] public List<string&g
System.Management.AutomationCmdlet.Cmdlet
,用于通过管道将字符串列表传递给Cmdlet,方法如下:
[Cmdlet(VerbsCommon.Add, "Signature")]
public class AddSignature : Cmdlet
...
[Parameter(Position = 0, ValueFromPipeline = true)]
public List<string> Items { get; set; }
...
是否有可能一次性传递整个项目列表(由Get ChildItem返回)?我一次只买一件东西
基本上,我希望使用管道的行为与使用类似命令的行为相同(Items.Count==3
)
有什么想法吗?实际上我一直在想同样的事情,尽管我的重点是直接从Powershell使用它,而不是在C#中。我认为这样做会有某种属性或官方方式 我看到的术语是“暂停管道”中的暂停,有时是缓冲区。我可以想出两个官方cmdlet来执行此操作:
Sort Object
暂停,因为它需要所有对象才能对它们进行排序<代码>格式表-自动调整大小会暂停,因为它需要所有对象才能确定列的大小
我在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
块执行所有实际处理并将项目发送到管道
'item1','item2','item3' | Add-Signature
您可以使用-Verbose
调用它,以查看何时调用每个块
如果有更好的方法,一种更正式或更受支持的方法,我很想知道这是什么。我还想用“结束”方法做实际工作,尽管这并不真正符合这种方法的含义。如果我没有找到更好的解决方案,这可能就是我的出路。
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
}
}
}