powershell - 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。
为什么这种行为不直观(尤其是第一个)?如果不运行代码,我会为这两个语句的输出使用真/假。
谢谢。
解决方案
奥拉夫在评论中提供了关键指针;让我充实一下:
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
参数不会提供任何性能优势,甚至可能会减慢速度。
推荐阅读
- google-chrome - 在 Chrome 中启用 MathML
- android - 在 Xamarin 中的登录按钮上实现 MVVM
- scalamock - 使用 scalamock 模拟在构造函数中“工作”的对象
- c# - C#在当前终端执行shell命令
- c# - WPF - 显示不同颜色的文本块
- flutter - 颤动下拉菜单没有布局
- php - cakephp bake SQLSTATE[HY000] [2002] 没有这样的文件或目录
- javascript - Safari 忽略 Javascript 媒体查询
- php - Laravel 5 - 有条件地解析服务提供者
- javascript - 我的网页无法通过 JSON 请求运行