具有未声明参数的函数具有优先于声明的优先级

时间:2017-09-25 12:31:42

标签: powershell

我想创建一个与log类似的Write-Host函数,我可以给它一些临时参数和一些参数:

function log ( [int]$ident=0, [switch]$notime) {

    $now = (Get-Date).ToString('s')

    Write-Host $(if (!$NoTime) {now}) $($args |  % { ' '*$ident*2 + $_ })
}



log  'test 1' 'test 2' #  Cannot convert value "test 1" to type "System.Int32"
log  'test 1' 'test 2'  -Ident 1  #Works

我知道我可以使用$args获取未声明的args或使用ValueFromRemainingArguments属性,但这需要我更改调用函数的方式,因为声明的函数参数将收集它们。

1 个答案:

答案 0 :(得分:4)

关闭位置绑定:

function log {
    [CmdletBinding(PositionalBinding=$False)]
    param (
        [int]$indent=0, 
        [switch]$notime,

        [Parameter(ValueFromRemainingArguments)]
        [string[]] $rest
    )

    $now = (Get-Date).ToString('s')

    Write-Host $(if (!$NoTime) {$now}) $($rest |  % { ' '*$indent*2 + $_ })
}

请注意,显然,您现在需要包含参数的名称,但这应该是一件好事(要知道1是否为{{1}的值,这会让人感到困惑或者记录的第一个值。