我刚刚了解到Get-Content 通过CR、CRLF 和LF 拆分和流式传输文件中的每一行,以便它可以在操作系统之间互换读取数据:
"1`r2`n3`r`n4" | Out-File .\Test.txt
(Get-Content .\Test.txt).Count
4
再次阅读问题,我可能误解了您的问题。
在任何情况下,如果您只想对特定字符组合进行拆分(计数):
CR
((Get-Content -Raw .\Test.txt).Trim() -Split '\r').Count
3
LF
((Get-Content -Raw .\Test.txt).Trim() -Split '\n').Count
3
CRLF
((Get-Content -Raw .\Test.txt).Trim() -Split '\r\n').Count # or: -Split [Environment]::NewLine
2
注意.Trim() 方法,它删除了Get-Content -Raw 参数添加的文件末尾的额外换行符(空格)。
附录
(根据内存异常的评论更新)
恐怕目前没有其他选择,然后使用ReadBlock 方法构建自己的StreamReader 并专门在CRLF 上拆分行。我已经为此问题打开了功能请求:-NewLine Parameter to customize line separator for Get-Content
获取线
解决内存异常错误的可能方法:
function Get-Lines {
[CmdletBinding()][OutputType([string])] param(
[Parameter(ValueFromPipeLine = $True)][string] $Filename,
[String] $NewLine = [Environment]::NewLine
)
Begin {
[Char[]] $Buffer = new-object Char[] 10
$Reader = New-Object -TypeName System.IO.StreamReader -ArgumentList (Get-Item($Filename))
$Rest = '' # Note that a multiple character newline (as CRLF) could be split at the end of the buffer
}
Process {
While ($True) {
$Length = $Reader.ReadBlock($Buffer, 0, $Buffer.Length)
if (!$length) { Break }
$Split = ($Rest + [string]::new($Buffer[0..($Length - 1)])) -Split $NewLine
If ($Split.Count -gt 1) { $Split[0..($Split.Count - 2)] }
$Rest = $Split[-1]
}
}
End {
$Rest
}
}
用法
为防止内存异常,请勿将结果分配给变量或使用方括号,因为这将停止 PowerShell PowerShell 管道并将所有内容存储在内存中。
$Count = 0
Get-Lines .\Test.txt | ForEach-Object { $Count++ }
$Count