2016-12-14 57 views
0

流媒體功能,我試圖創建一個模擬的Linux的頭一個功能:(無論是通過或$輸入讀取$ filess)如何寫在PowerShell中

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 
    } 
} 

的問題是,這實際上會閱讀所有內容然後打印第一個,在那裏我想要頭部讀取第一行並忘記其餘部分,以便它可以處理大文件。

該功能如何重寫?

+1

首先,你應該使用'process'塊,因爲'end'(它是隱式'end'塊,你不使用任何)被在所有先前的命令已經完成其執行之後執行。有關如何提前退出管道的提示,可以使用[answer](http://stackoverflow.com/a/34800670)。 – PetSerAl

回答

1

嘛,據我所知,你是稍微過頭了...
「在Windows PowerShell中3.0開始,選擇,對象包括優化功能,防止創建命令和處理對象未使用 。當您在命令管道中包含帶有First或Index參數的Select-Object命令時,即使在生成對象的命令出現之前,Windows PowerShell也會停止生成對象的命令管道中的Select-Object命令。要關閉此優化行爲,請使用Wait參數。「

因此,所有你需要做的是:

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

事實上,你的命令行工作得很快,但是當我直接使用'head'而不是select-object時,它會掛起。這是即使它使用選擇對象。因此我的問題是關於如何正確寫入 – IttayD

+0

我不明白這個問題,你不需要你的函數,你應該使用select-object,它會停止管道,所以它不會讀取整個文件。 – 4c74356b41

+0

我的功能輸入時間較短。此外,由於我擁有更多這樣的功能,所以問題更一般化。 – IttayD