以下函數將通過使用.NET類StreamReader類逐行讀取文件,並將每條線沿管道向下發送。
function Get-ContentByLine {
param (
[Parameter(Mandatory=$true,ValueFromPipeline=$true)][PsObject]$InputObject
)
begin {
$line = $null
$fs = [System.IO.File]::OpenRead($InputObject)
$reader = New-Object System.IO.StreamReader($fs)
}
process {
$line = $reader.ReadLine()
while ($line -ne $null) {
$line
$line = $reader.ReadLine()
}
}
end {
$reader.Dispose();
$fs.Dispose();
}
}
你會調用它像這樣:
發送這
Out-Null
它正在執行一個近200萬行的日誌文件(〜186 MB),而我的內存使用量僅上升了KB的幾個10的
PS C:\> Get-ContentByLine "C:\really.big.log" | Out-Null
有趣。當然,使用.NET是有道理的,但我從來沒有見過begin/process/end。 [一些細節](http://ss64.com/ps/syntax-function-input.html)對於像我這樣陌生的人。如果PowerShell已經內置了類似的東西,那將會非常好。 – jpmc26