管道记录无效

时间:2019-01-10 21:56:20

标签: powershell powershell-v2.0 powershell-v3.0 powershell-v4.0

我想将cmdlet链接到以NN记录的Import-Csv文件开头的管道中,以进行处理,最后,我想为所有NN记录和累积的处理结果写出结果文件。在此过程中,我可能想将数据添加到管道中,即不再进一步处理该记录,但仍将其传递到管道中。

我设想这样的样子:

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

每个cmdlet被写入以管道传输每个记录的所有$_属性,并将它们保留在管道中。

读取某种“ CanContinue”属性的最佳方法是什么,如果它是错误的短路处理,然后将其直接传递给管道中的下一个cmdlet,而不进行处理?

1 个答案:

答案 0 :(得分:1)

我假设您不希望此标志成为结果CSV的一部分。我的观察方式可以使用两种类似的方法:将标志添加到正在处理的对象中,然后再返回它,或者将该对象包装在另一个对象中(该对象包含标志和另一个保存原始对象的属性)。

现在,我将探讨添加属性的第一个选项。我将其从正数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

奖金:

Refer back to my answer on another question of yours,而不是手动检查属性,而是使用[Parameter(ValueFromPipelineByPropertyName)]将其定义为处理cmdlet中的参数,如下所示:

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

为什么这样做?因为可以让PowerShell为您处理对象,所以您只需检查$DoNotContinue的值即可。它还允许您为特定呼叫覆盖该值。

(在这种情况下,我将其重命名为$DoNotProcess$SkipProcessing或其他名称;请记住,如果您希望它具有多个名称,也可以使用[Alias()]