2016-12-14 1 views
0

Ich habe versucht, eine Funktion zu erstellen, die Linux Kopf emuliert:wie Streaming-Funktion in Powershell schreiben

Function head() 
{ 
    [CmdletBinding()] 
    param (
     [parameter(mandatory=$false, ValueFromPipeline=$true)] [Object[]] $inputs, 
     [parameter(position=0, mandatory=$false)] [String] $liness = "10", 
     [parameter(position=1, ValueFromRemainingArguments=$true)] [String[]] $filess 
    ) 

    $lines = 0 
    if (![int]::TryParse($liness, [ref]$lines)) { 
     $lines = 10 
     $filess = ,$liness + (@{[email protected]();$false=$filess}[$null -eq $filess]) 
    } 
    $read = 0 

    $input | select-object -First $lines 

    if ($filess) { 
     get-content -TotalCount $lines $filess 
    } 
} 

Das Problem ist, dass dies tatsächlich die gesamten Inhalt gelesen wird (ob von $ filess oder von $ input lesen) und drucke dann die erste, wo ich möchte, dass ich die ersten Zeilen lese und den Rest vergesse, damit es mit großen Dateien arbeiten kann.

Wie kann diese Funktion umgeschrieben werden?

+1

Zunächst einmal sollten Sie 'process' Block verwenden, da' end' (es implizite 'end' Block ist wie jede nicht verwenden) wird ausgeführt, nachdem alle vorherigen Befehle ihre Ausführung bereits abgeschlossen haben. Und für Tipps, wie Sie die Pipeline vorzeitig verlassen, können Sie diese [Antwort] (http://stackoverflow.com/a/34800670) verwenden. – PetSerAl

Antwort

1

Nun, soweit ich weiß, können Sie es leicht übertreiben ...
„Beginning in Windows Powershell 3.0, Select-Object enthält eine Optimierungsfunktion, die Befehle von der Erstellung und Verarbeitung von Objekten verhindert, die nicht verwendet werden Wenn Sie einen Select-Object-Befehl mit dem First- oder Index-Parameter in einer Befehlspipeline einschließen, stoppt Windows PowerShell den Befehl, der die Objekte generiert, sobald die ausgewählte Anzahl von Objekten generiert wird, selbst wenn der Befehl zum Erstellen der Objekte zuvor angezeigt wird Der Select-Object-Befehl in der Pipeline. Um dieses Optimierungsverhalten zu deaktivieren, verwenden Sie den Wait-Parameter. "

Also alles, was Sie tun müssen, ist:

Get-Content -Path somefile | Select-Object -First 10 #or pass a variable 
+0

In der Tat, Ihre Befehlszeile funktioniert schnell, aber wenn ich 'Kopf' anstelle von Select-Objekt direkt verwenden, hängt es. Dies ist auch dann der Fall, wenn select-object verwendet wird. Daher meine Frage, wie man es richtig schreibt – IttayD

+0

Ich verstehe die Frage nicht, Sie brauchen nicht Ihre Funktion, sollten Sie nur select-Objekt verwenden, stoppt es die Pipeline, so wird es nicht die ganze Datei lesen. – 4c74356b41

+0

meine Funktion ist kürzer zu schreiben. und außerdem ist die Frage allgemeiner, da ich mehr solche Funktionen habe. – IttayD

Verwandte Themen