Get-Content и Measure-Object хороши для небольших файлов, но оба супер неэффективны с памятью. У меня были реальные проблемы с большими файлами.
При подсчете строк в файле объемом 1 ГБ с использованием любого из методов Powershell сожрал всю доступную память на сервере (8 ГБ), а затем начал выполнять подкачку на диск. Я оставил его более часа, но он все еще работал на диске, поэтому я его убил.
Лучший метод, который я нашел для больших файлов, - это использовать IO.StreamReader для загрузки файла с диска и подсчета каждой строки с помощью переменной. Это сокращает использование памяти до очень разумных 25 МБ и намного, намного быстрее, занимая около 30 секунд для подсчета строк в файле объемом 1 ГБ или пару минут для файла размером 6 ГБ. Он никогда не съедает необоснованные объемы оперативной памяти, независимо от размера файла:
[int]$LinesInFile = 0
$reader = New-Object IO.StreamReader 'c:\filename.csv'
while($reader.ReadLine() -ne $null){ $LinesInFile++ }
Приведенный выше фрагмент кода можно вставить везде, где бы вы ни использовали get-content или measure-object, просто обратитесь к переменной $ LinesInFile, чтобы получить количество строк в файле.