2015-11-04 325 views
20

我想在PowerShell中逐行读取文件。具体来说,我想遍历文件,将每行存储在循环中的变量中,然后在行上进行一些处理。在PowerShell中逐行读取文件

我知道猛砸相当于:

while read line do 
    if [[ $line =~ $regex ]]; then 
      # work here 
    fi 
done < file.txt 

没有对PowerShell的多文档循环。

回答

40

PowerShell循环中没有太多文档。在PowerShell中环

文档充足,你可能想看看下面的帮助主题:about_Forabout_ForEachabout_Doabout_While

foreach($line in Get-Content .\file.txt) { 
    if($line -match $regex){ 
     # Work here 
    } 
} 

另一个惯用的PowerShell的解决问题的方法是将管道中的文本文件到ForEach-Object cmdlet行:

Get-Content .\file.txt | ForEach-Object { 
    if($_ -match $regex){ 
     # Work here 
    } 
} 

取而代之的是循环内正​​则表达式匹配的,你可以管的线通过Where-Object来过滤那些你感兴趣的内容:

Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object { 
    # Work here 
} 
+0

链接不破每行一个,但他们现在重定向到'docs.microsoft.com'。 –

+0

当您尝试阅读大文件时,Get-Content'真的很糟糕 –

+1

@KolobCanyon绝对正确:-)您可以在大小/比例上添加关于性能成本的单独答案 –

8

Get-Content表现不佳;它会尝试一次将文件读入内存。

C#(.NET)文件阅读器读取由一个

foreach($line in [System.IO.File]::ReadLines("C:\path\to\file.txt")) 
{ 
     $line 
} 
+0

我可能会使用'[System.IO.File] :: ReadLines(“C:\ path \ to \ file.txt”)| ForEach-Object {...}'。 'foreach'语句[将整个集合加载到一个对象](https://blogs.technet.microsoft.com/heyscriptingguy/2014/07/08/getting-to-know-foreach-and-foreach-object/ )。 'ForEach-Object'使用一个流水线进行流处理。现在'foreach'语句可能会比'ForEach-Object'命令稍微快一点,但这是因为将整个内容加载到内存通常会更快。然而,Get-Content仍然很糟糕。 –

+0

@BaconBits foreach()是“Foreach-Object”的别名 –

+5

这是一个非常常见的误解。 “foreach”是一个陈述,如“if”,“for”或“while”。 'ForEach-Object'是一个命令,像'Get-ChildItem'。对于'ForEach-Object',还有一个'foreach'的默认别名,但只有在有管线时才使用。请参阅'Get-Help about_Foreach'中的详细解释,或者点击我之前评论中的链接,该链接由Microsoft的The Scripting Guys撰写至整篇文章,内容涉及语句与命令之间的差异。 –