这是我的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
设置的默认设置是什么,以便它是当前用户?
答案 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
}