Аннулирование записи конвейера - PullRequest
0 голосов
/ 11 января 2019

Я хочу объединить командлеты в конвейер, начиная с Import-Csv файла NN записей для обработки, в конце я хочу выписать файл результатов для всех NN записей и накопленных результатов обработки. По пути я, возможно, захочу добавить в конвейер данные, которые говорят, что не обрабатывают эту запись дальше, но все же передают ее в конвейер.

Я предполагал, что это выглядит так:

Import-Csv input | step-1 -env DEV | step-2 | step-3 | Export-Csv result

Каждый командлет записывается в канал для всех $_ свойств каждой записи и сохраняет их в конвейере.

Какой лучший способ прочитать какое-либо свойство «CanContinue», если это ложная обработка короткого замыкания, и просто передать ее следующему командлету в конвейере без обработки?

1 Ответ

0 голосов
/ 11 января 2019

Я предполагаю, что вы не хотите, чтобы этот флаг был частью результирующего CSV. На мой взгляд, вы можете использовать 2 аналогичных подхода: добавить флаг к обрабатываемому объекту перед его возвратом или обернуть объект в другой объект (который содержит флаг и другое свойство, которое содержит исходный объект).

А пока я собираюсь изучить первый вариант, где вы добавляете свойство. Я собираюсь изменить его с положительного CanContinue на отрицательное DoNotProcess, чтобы его несуществование могло слиться с $false (продолжайте).

Для этого в каждой из ваших функций обработки просто проверьте значение свойства DoNotContinue. Если это $true, вернуть полученный исходный объект без дополнительной обработки.

Если это $false, вы можете выполнить обработку и, если выполнены условия, что обработка должна быть остановлена, вы принудительно добавляете свойство с помощью $true:

Process {
    # processing done
    $MyObj |
        Add-Member -NotePropertyName DoNotContinue -NotePropertyValue $true -Force -PassThru
}

Все такие команды могут справиться с этим.

Теперь, когда дело доходит до конца конвейера, вы не хотите, чтобы это свойство записывалось в CSV. Для этого удалите его с Select-Object:

Import-Csv input | 
    step-1 -env DEV | 
    step-2 | 
    step-3 | 
    Select-Object -Property * -ExcludeProperty DoNotContinue |
    Export-Csv result

Бонус:

Вернитесь к моему ответу на другой ваш вопрос и вместо ручной проверки свойства определите его как параметр в ваших командлетах обработки с помощью [Parameter(ValueFromPipelineByPropertyName)], например:

param(
    [Parameter(ValueFromPipelineByPropertyName)]
    [Switch]
    $DoNotContinue
)

Зачем это? Потому что вы позволяете PowerShell обрабатывать объект для вас, и вам нужно только проверить значение $DoNotContinue. Это также позволяет вам переопределить это значение для определенного вызова.

(в этом случае я бы переименовал его в $DoNotProcess или $SkipProcessing или что-то еще; помните, что вы также можете использовать [Alias()], если хотите, чтобы оно имело несколько имен)

...