当前用户默认为自定义CmdletBinding的PSCredential参数

时间:2016-12-22 08:42:45

标签: powershell

这是我的Powershell场景的一个副本:

function Call-Api {
    [CmdletBinding()]
    param(
        [Parameter(Position = 0, Mandatory = $false)]
        [System.Management.Automation.Credential()]
        [System.Management.Automation.PSCredential]
        $Credential = [System.Management.Automation.PSCredential]::Empty
    )

    Invoke-RestMethod -Uri "http://localhost/api" -Method Get -Credential $Credential
}

API具有基本身份验证功能。如果我这样称呼它:

$pwd = ConvertTo-SecureString "secret!" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ("username", $pwd)
Call-Api $cred

然后我得到了适当的回应。但如果我没有这样的凭证就打电话给它:

Call-Api

我明白了:

  

Invoke-RestMethod:未将对象引用设置为对象的实例。

我当然可以if ... else切换$Credential是否设置,但这不是很优雅。从the relevant docs我了解 cmdlet的默认值是" 当前用户"。

我该怎样做类似的事情?我为$Credential设置的默认设置是什么,以便它是当前用户?

1 个答案:

答案 0 :(得分:1)

您可以删除您定义为默认的Empty Credential(我相信这会覆盖cmdlet自己当前用户的默认值),然后使用splatting并仅添加$Credential参数(如果存在) 。如果它不存在,它将使用cmdlet自己的默认值。

function Call-Api {
    [CmdletBinding()]
    param(
        [Parameter(Position = 0)]
        [System.Management.Automation.Credential()]
        [System.Management.Automation.PSCredential]
        $Credential
    )

    $params = @{}

    $params['Uri'] = "http://google.com"
    $params['Method'] = "Get"

    if ($Credential) { $params['Credential'] = $Credential }

    Invoke-RestMethod @params
}