首页 > 解决方案 > PowerShell 获取内容 -ReadCount

问题描述

我想知道以下两个几乎相同的陈述之间的区别:

Get-Content c:\temp\myfile.txt -ReadCount 10 | ForEach-Object { $_ -match 'my_string' }
Get-Content c:\temp\myfile.txt | ForEach-Object { $_ -match 'my_string' }

第一个语句返回 myfile.txt 中存在匹配子字符串的行,而第二个语句根据传递给 ForEach 的每一行的匹配返回 true 或 false。

为什么这种行为不直观(尤其是第一个)?如果不运行代码,我会为这两个语句的输出使用真/假。

谢谢。

标签: powershell

解决方案


奥拉夫在评论中提供了关键指针;让我充实一下:

  • Get-Content-ReadCount参数通过管道发送从输入文件读取的行数组(批次)。

  • 因此,接收调用中的自动$_变量ForEach-Object然后引用行数组而不是单行,就像没有 -ReadCount.

  • 使用数组(集合)作为 LHS,PowerShell 的比较运算符(例如)-match 充当过滤器并返回匹配项的子数组而不是布尔值。

    • 在 的情况下-match,特别是,使用数组值 LHS 还意味着报告操作捕获的文本的自动$Matches变量没有填充-match

换一种说法:

虽然使用Get-Content -ReadCount可以加快文本文件的处理速度ForEach-Object,但您需要遍历报告的数组元素$_以获得逐行处理:

Get-Content c:\temp\myfile.txt -ReadCount 10 | 
  ForEach-Object { foreach ($line in $_) { $line -match 'my_string' } }

请注意,它的行为与您预期的一样是通用-OutBuffer参数-OutBuffer $n:表示手头的 cmdlet 在1 + $n输出到管道之前收集对象,但是,在这一点上,它们像往常一样被逐一输出。

也就是说,除非 的值$n很大,否则很少使用的-OutBuffer参数不会提供任何性能优势,甚至可能会减慢速度。


推荐阅读