Расширенные функции Powershell: должны ли быть инициализированы необязательные параметры?

filter CountFilter($StartAt = 0) 
{ 
    Write-Output ($StartAt++) 
}

function CountFunction
{
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline=$true, Mandatory=$true)]
        $InputObject,
        [Parameter(Position=0)]
        $StartAt = 0
    )

    process 
    { 
        Write-Output ($StartAt++) 
    }
}

$fiveThings = $dir | select -first 5  # or whatever

"Ok"
$fiveThings | CountFilter 0

"Ok"
$fiveThings | CountFilter

"Ok"
$fiveThings | CountFunction 0

"BUGBUG ??"
$fiveThings | CountFunction

Я искал Connect и не нашел никаких известных ошибок, которые могли бы вызвать это несоответствие. Кто-нибудь знает, это по дизайну?


person Richard Berg    schedule 22.01.2010    source источник


Ответы (1)


Это появилось в списке рассылки MVP. Похоже, что с функциями adv PowerShell перепривязывает (переоценивает) значение по умолчанию каждый раз, когда получает объект конвейера. Люди в списке посчитали это ошибкой. Вот обходной путь:

function CountFunction 
{ 
    [CmdletBinding()] 
    param ( 
        [Parameter(ValueFromPipeline=$true, Mandatory=$true)] 
        $InputObject, 

        [Parameter(Position=0)] 
        $StartAt
    )

    begin 
    {
        $cnt = if ($StartAt -eq $null) {0} else {$StartAt}
    }

    process  
    {  
        Write-Output ($cnt++)
    } 
} 

$fiveThings = dir | select -first 5  # or whatever 

"Ok" 
$fiveThings | CountFunction 0 

"FIXED" 
$fiveThings | CountFunction
person Keith Hill    schedule 22.01.2010
comment
Обходной путь, который я сейчас использую, еще проще: [Parameter(Position=0)]$StartIndex=0 .... begin {$Counter = $StartIndex} - person Richard Berg; 22.01.2010