如何在PowerShell中编写流功能

时间:2016-12-14 09:06:32

标签: powershell

我尝试创建一个模拟Linux头的功能:

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 + (@{$true=@();$false=$filess}[$null -eq $filess]) 
    }
    $read = 0

    $input | select-object -First $lines

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

问题是这实际上会读取所有内容(无论是通过阅读$ filess还是来自$ input)然后打印第一个内容,我希望头部读取第一行并忘记其余部分它可以处理大文件。

如何重写此功能?

1 个答案:

答案 0 :(得分:1)

嗯,据我所知,你稍微过度了...... “从Windows PowerShell 3.0开始, Select-Object包含一个优化功能,可防止命令创建和处理未使用的对象。当您在第一个或索引参数中包含一个Select-Object命令时命令管道,一旦生成所选数量的对象,Windows PowerShell就会停止生成对象的命令,即使生成对象的命令出现在管道中的Select-Object命令之前也是如此。要关闭此优化行为,请使用等待参数。“

所以你需要做的就是:

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