Расширенные функции Powershell: дополнительные параметры должны инициализироваться? - PullRequest
1 голос
/ 22 января 2010
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 и не нашел никаких известных ошибок, которые могли бы вызвать это несоответствие. Кто-нибудь знает, если это по замыслу?

1 Ответ

2 голосов
/ 22 января 2010

Это появилось в списке рассылки 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
...