Powershell:改变通过流的项目的惯用方式?

时间:2014-10-31 19:40:25

标签: powershell

处理输入流时,有时需要对通过流的对象进行更改。允许这些对象传递到另一端以便它们可以通过管道传输到其他进程中也很有用。变异和传递是否有比这更习惯/简洁的方式?

$input | % {
    if ($_.Office.length -ne 11) { $_.Errors += "Bad office" }
    $_ #needed to allow additional piping
} 

其他一些运营商?类似...... %!

$input | %! {
    if ($_.Office.length -ne 11) { $_.Errors += "Bad office" }
} #whatever goes in must come out

1 个答案:

答案 0 :(得分:0)

我没有看到第一个例子有什么问题,但你可以编写自己的函数然后使用它:

function Do-Modification {
[CmdletBinding()]
param(
    [Parameter(
        ValueFromPipeline=$true
    )]
    $myObject
)

    Process {
        if ($myObject.Office.length -ne 11) {
            $myObject.Errors += "Bad Office"
        }
        $myObject
    }
}

$inputs | Do-Modification

# or to use it in a larger ForEach-Object (even though it's redundant here)

$inputs | ForEach-Object {
    $_ | Do-Modification
}

编辑添加:

这是一个人为的例子;它可能不值得重新发明轮子(编写自己的管道功能),除了代码重用(在我看来它非常值得)。由您来决定一种方法或另一种方法的意义。