Командлет передает список параметров сразу через конвейер, а не отдельные элементы списка

Я создаю 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 чтобы увидеть, когда каждый блок вызывается.

Если есть лучший способ, более официальный или поддерживаемый способ, мне очень интересно знать, что это такое.

Другие вопросы по тегам