powershell - 使用powershell在文本文件中找到特定行后如何停止Get-Content -wait?按需退出管道

标签 powershell pipeline break powershell-5.0

我在 Powershell 中使用以下脚本(版本为 5.1):

Get-Content -Path path\to\text\file\to\be\read.txt -Wait

现在,即使文件没有更新,它也会继续读取。
在文本文件中找到特定行后如何停止?
有没有其他方法可以在条件下阻止这种情况?

最佳答案

tl;博士

do {
  Get-Content -Path path\to\text\file\to\be\read.txt -Wait | ForEach-Object {
    # Pass the input line through.
    $_
    # Exit once the string of interest is found.
    if ($_ -match 'patternOfInterest') { break } 
  }
} while ($false) # dummy loop so that `break` can be used.

# NOTE: Without the dummy `do` loop, this code would not be reached.
'Line of interest found.'
请注意 -match operator使用正则表达式 ( about_Regular_Expressions ) 执行子字符串匹配。
继续阅读以了解为什么要使用假人 do需要循环。

Paxz's answer是在正确的轨道上,但是 它尝试使用 break (孤立地)退出管道,这(通常)终止整个脚本 (如果您以交互方式将管道作为单个命令提交,您可能不会注意到)。
break/continue旨在退出/继续循环(forforeachdowhileswitch 语句[1]),而不是管道 .
从 PowerShell [Core] 7.2.2 开始,没有直接的方法可以提前退出管道 ,尽管添加此功能是 this long-standing feature request on GitHub 的主题;目前只能直接使用Select-Object-First可以通过使用非公共(public)异常提前退出管道;而return可用于 ForEach-Object脚本 block ,它只退出当前脚本 block 调用,同时继续处理额外的管道输入。
如果您使用 breakcontinue , PowerShell 将查找任何封闭循环,如果没有,则整个脚本退出。
但是,如果您在管道周围包裹一个虚拟循环 [2],如上所示 - 其唯一目的是为 break 提供一些东西突破- 执行继续,如(通常)所希望的 .
警告 :
break/continue (和 throw )有一个重要的副作用 : 他们不要让参与管道的其他命令有机会正常退出 ;也就是说,他们的end block /EndProcessing()方法没有被调用,这可能在两个方面存在问题:
  • 需要清理(处置)临时持有的资源的 Cmdlet 无法清理。
  • 请注意,遗憾的是,这种无法清理的情况也适用于使用 Select-Object -First。使用高级 PowerShell 函数/脚本(但不使用(二进制)cmdlet,它可以通过实现 System.IDisposable 接口(interface)来确保清理),如 GitHub issue #7930 中所述; GitHub PR #9900旨在解决这个问题,引入一个专用的 cleanup堵塞。

  • 聚合 cmdlet - 那些必须在能够产生输出之前收集所有输入的那些 - 永远不会产生输出;这是一个简单的例子:

  • PS> do { 5..1 | % { $_; if ($_ -eq 3) { break } } | Sort-Object } while ($false)
    # !! NO OUTPUT, because Sort-Object's EndProcessing() method was never called.
    

    [1] 当您使用 switch 检查单个值时声明,break如您所料,退出语句。如果正在处理值的数组(集合),break too 立即退出语句,不处理数组中的其他元素; continue相比之下,继续处理下一个元素。
    [2] 另一种选择是使用 throw通过将管道包含在 try / catch statement 中来生成脚本终止错误,如this answer所示.但是,这有在自动 $Error 中记录条目的副作用。收集,即使在概念上没有发生实际错误。

    关于powershell - 使用powershell在文本文件中找到特定行后如何停止Get-Content -wait?按需退出管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51981048/

    相关文章:

    C 如何使用 esc 退出 while 循环

    c# - 列出对象内的 .NET 对象

    powershell - Powershell:Get-Process不会返回远程描述

    powershell - 由于archive_id名称的原因,无法删除AWS Glacier存档?

    python - scikit 管道 python 中的多个分类模型

    linux - 在 bash 中评估代表单个管道命令的两个变量的最佳方法是什么?

    powershell - 从PowerShell执行SQL * Plus

    python - 当重采样方法不适用于文本时,如何创建用于文本分类的 SMOTE 管道步骤?

    java - 如何重写或修改此代码以使其工作相同但不使用break语句

    Python 内部中断函数