管道数据时,参数验证行为不一致

时间:2018-01-31 15:11:14

标签: powershell error-handling parameter-passing

我很好奇为什么在终止或非终止错误方面,管道参数和非管道参数之间的参数验证存在差异。一些代码要解释。

测试功能:

Function Test-Foo {
    Param (
        [Parameter(Mandatory)]
        [ValidateScript({Test-Path -Path $_ -PathType Container})]
        [String]$Path,
        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [ValidateScript({return $false})]
        [Alias('Key')]
        [String]$SamAccountName,
        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [ValidateSet('ReadAndExecute','Write','Modify','FullControl','ListFolderContents')]
        [Alias('Value')]
        [String]$Grant
    )

    $PSBoundParameters
}

终止错误:

Try {
    Test-Foo -Path $env:TEMP -SamAccountName NonExisting
    Write-Host 'Non terminationg error' -ForegroundColor Yellow
}
Catch {
    throw "Terminating error found: $_"
}
管道

非终止错误:

Try {
    @{
        'NonExisting' = 'FullControl'
    }.GetEnumerator() | Test-Foo -Path $env:TEMP
    Write-Host 'Non terminationg error' -ForegroundColor Yellow
}
Catch {
    throw "Terminating error found: $_"
}

有人可以向我解释为什么函数会在没有管道输出时抛出终止错误,而在管道传输时会出现非终止错误?是否有可能在不执行任何操作的情况下实现相同的行为:

... | Test-Foo -Path $env:TEMP -ErrorAction Stop

0 个答案:

没有答案