【发布时间】:2021-08-14 21:22:46
【问题描述】:
我想知道以下两个几乎相同的陈述之间的区别:
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。
为什么这种行为不直观(尤其是第一个)?如果不运行代码,我会为这两个语句的输出选择真/假。
谢谢。
【问题讨论】:
-
在第一种情况下,您不会一次将一行传递给管道。相反,一次有十行。这就是
-match运算符切换到其过滤模式并输出过滤后的行的原因。 -
您可以阅读更多关于帮助主题about_Comparison_Operators
-
谢谢奥拉夫。我认为 Get-Content 中的 -readcount 仅与文件 I/O 操作有关(一次读取 10 行,而不是一次从文件中读取一行,否则会导致 I/O 缓慢)。我不知道所有 10 行都作为单个数组/集合传递到 foreach - 我在想即使一次读取 10 行,它们中的每一行都一次传递给 foreach 。这是否意味着在内部 Get-Content 使用逗号运算符将 10 行作为数组传递到 foreach 中,语法为 ,$TempArrayOfTenLines ? (注意,$ 符号前有一个逗号。
-
@Steve 这是一个有效的问题,您可以自己看到
X行通过执行{ $_.Count }传递通过管道,这也解释了为什么在ReadCount示例-matches的行为就像它正在做的那样。
标签: powershell