是否可以从过滤器中终止或停止PowerShell管道

Dan*_*ane 10 powershell pipeline

我编写了一个简单的PowerShell过滤器,如果它的日期在指定的开始日期和结束日期之间,则将当前对象推送到管道中.管道下方的对象始终按升序排列,因此一旦日期超过指定的结束日期,我就知道我的工作已完成,我想告诉管道上游命令可以放弃他们的工作以便管道可以完成它的工作.我正在阅读一些非常大的日志文件,我经常想要检查一部分日志.我很确定这是不可能的,但我想问一下.

小智 6

有可能破坏管道,否则会破坏外部循环或完全停止脚本执行(比如抛出异常).然后解决方案是将管道包装在一个循环中,如果需要停止管道,可以中断该循环.例如,下面的代码将返回管道中的第一个项目,然后通过打破外部do-while循环来中断管道:

do {
    Get-ChildItem|% { $_;break }
} while ($false)
Run Code Online (Sandbox Code Playgroud)

这个功能可以包装成这样的函数,其中最后一行完成与上面相同的操作:

function Breakable-Pipeline([ScriptBlock]$ScriptBlock) {
    do {
        . $ScriptBlock
    } while ($false)
}

Breakable-Pipeline { Get-ChildItem|% { $_;break } }
Run Code Online (Sandbox Code Playgroud)


Ste*_*ski 3

无法从下游命令停止上游命令。它将继续过滤掉与您的条件不匹配的对象,但第一个命令将处理它设置为处理的所有内容。

解决方法是对上游 cmdlet 或函数/过滤器进行更多过滤。使用日志文件会使事情变得更加复杂,但也许使用 Select-String 和正则表达式来过滤掉不需要的日期可能对您有用。

除非您知道要读取多少行以及从哪里读取,否则将读取整个文件以检查模式。