【发布时间】:2016-02-04 08:27:25
【问题描述】:
我想在 PowerShell 中逐行读取文件。具体来说,我想循环遍历文件,将每一行存储在循环中的一个变量中,对行做一些处理。
我知道 Bash 等价物:
while read line do
if [[ $line =~ $regex ]]; then
# work here
fi
done < file.txt
关于 PowerShell 循环的文档不多。
【问题讨论】:
-
从 Mathias 选择的答案不是一个很好的解决方案。
Get-Content一次将整个文件加载到内存中,这将失败或冻结大文件。 -
@KolobCanyon 这完全不真实。默认情况下,Get-Content 将每一行加载为管道中的一个对象。如果您要传递到一个未指定
process块的函数,并且每行将另一个对象吐出到管道中,那么该函数就是问题所在。将全部内容加载到内存中的任何问题都不是Get-Content的错。 -
@TheFish
foreach($line in Get-Content .\file.txt)它将在开始迭代之前将整个文件加载到内存中。如果您不相信我,请获取一个 1GB 的日志文件并尝试一下。 -
@KolobCanyon 这不是你说的。您说 Get-Content 将其全部加载到内存中,这是不正确的。您更改的 foreach 示例会,是的; foreach 不支持管道。
Get-Content .\file.txt | ForEach-Object -Process {}是管道感知的,不会将整个文件加载到内存中。默认情况下,Get-Content 将通过管道一次传递一行。