Dies ist möglicherweise auch mit integrierten Cmdlets möglich, aber ich würde mich nicht für die Ausführung Get-Content
von Dateien mit mehr als 100 MB entscheiden. Wenn Sie es versuchen möchten, möchten Sie vielleicht ein Äquivalent fürtail
. Ich bin mir nicht sicher, ob sie klug genug sind, um voranzukommen, oder ob sie versuchen, jede Zeile von Anfang an zu lesen und nur die letzten X-Zeilen anzuzeigen. Offensichtlich würde der letztere Ansatz eine Weile dauern, wenn er versuchen würde, 90 GB zu lesen und zu überspringen.
Wenn Sie sich nicht für in Windows integrierte Tools interessieren, glaube ich, dass die tail
Implementierung von GNU intelligenter ist. Dies kann von der WSL oder einem der vielen Ports aus ausgeführt werden.
Beim reinen PowerShell / .NET-Skripting werde ich ein früheres PowerShell-Skript anpassen, das zum Aufteilen einer einzelnen großen Datei entwickelt wurde. Dieses Skript wurde für die Verwendung von 4-KB-Blöcken geschrieben, um die Speicherauslastung zu minimieren. Wir können zuerst zum richtigen Ort (einer fast sofortigen Operation) suchen und von dort aus kopieren. Der Einfachheit halber wird keine Analyse für den nächsten / vorherigen Zeilenumbruch durchgeführt. Wir springen einfach zu einem bestimmten Byte (sogar zur Mittellinie).
Wenn Sie es vorziehen, eine bestimmte Entfernung von Anfang an zu suchen, können Sie z. B. $seekLoc = 97GB
und ersetzen $seekOrigin = "Begin"
und vielleicht $copyLen = 10GB
sicher sein und das Ende nicht verpassen.
$inFile = "foo.txt" $outFile = "bar.txt" $seekLoc = -1GB $seekOrigin = "End" $copyLen = 1GB # need to sync .NET CurrentDirectory with PowerShell CurrentDirectory # https://stackoverflow.com/questions/18862716/current-directory-from-a-dll-invoked-from-powershell-wrong [Environment]::CurrentDirectory = Get-Location # 4k is a fairly typical and 'safe' chunk size # partial chunks are handled below $bytes = New-Object byte[] 4096 $inReader = [System.IO.File]::OpenRead($inFile) $inReader.Seek($seekLoc, $seekOrigin) # better to use functions but a flag is easier in a simple script $finished = $false $bytesToRead = $copyLen # Just like File::OpenWrite except CreateNew instead to prevent overwriting existing files $outWriter = New-Object System.IO.FileStream "$outFile",CreateNew,Write,None while ($bytesToRead) { # read up to 4k at a time, but no more than the remaining bytes from copyLen $bytesRead = $inReader.Read($bytes, 0, [Math]::Min($bytes.Length, $bytesToRead)) # 0 bytes read means we've reached the end of the input file if (!$bytesRead) { break } $bytesToRead -= $bytesRead $outWriter.Write($bytes, 0, $bytesRead) } # dispose closes the stream and releases locks $outWriter.Dispose() $inReader.Dispose()