Командлет передает список параметров сразу через конвейер, а не отдельные элементы списка
Я создаю Powershell System.Management.AutomationCmdlet.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) сразу? Я получаю только один предмет за раз.
По сути, я хочу, чтобы при использовании конвейера было то же поведение, что и при использовании команды, подобной этой (Items.Count == 3
)
Add-Signature -Items "item1","item2","item3"
Любая идея?
1 ответ
Мне действительно интересно то же самое, хотя я сосредоточился на том, чтобы использовать это непосредственно из Powershell, а не в C#. Я думал, что будет какой-то атрибут или официальный способ сделать это.
Термины, которые я видел, используются как "остановка конвейера" или иногда как буфер. Есть два официальных командлета, о которых я могу думать: 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
чтобы увидеть, когда каждый блок вызывается.
Если есть лучший способ, более официальный или поддерживаемый способ, мне очень интересно знать, что это такое.