我想将cmdlet链接到以NN记录的Import-Csv
文件开头的管道中,以进行处理,最后,我想为所有NN记录和累积的处理结果写出结果文件。在此过程中,我可能想将数据添加到管道中,即不再进一步处理该记录,但仍将其传递到管道中。
我设想这样的样子:
Import-Csv input | step-1 -env DEV | step-2 | step-3 | Export-Csv result
每个cmdlet被写入以管道传输每个记录的所有$_
属性,并将它们保留在管道中。
读取某种“ CanContinue”属性的最佳方法是什么,如果它是错误的短路处理,然后将其直接传递给管道中的下一个cmdlet,而不进行处理?
答案 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()]
)