1

我正在 Powershell 中实现一个函数,它将执行 REST 调用。根据给定的场景,其中一个参数的内容可能会有所不同。例如,body调用的REST可能是字符串或哈希表。您如何在CmdletBinding()声明中实现这一点?

例如

Function doRESTcall(){
[CmdletBinding()]
        param (
            [Parameter(Mandatory=$true)]
            [Hashtable]$headers
            [Parameter(Mandatory=$true)]
            [???????]$body # what type here??
        )
.
.
.
}
4

2 回答 2

2

要声明允许任何类型的参数,您可以根本不对参数进行类型约束或使用类型约束[object]( System.Object ),这样做不需要类型转换,因为 PowerShell 中的所有对象都继承自该类型。

值得一提的是,不受约束的参数将允许$null作为参数,以避免这种情况,[ValidateNotNull()]并且/或者[parameter(Mandatory)]可以使用。

function Test-Type {
    param(
        [parameter(ValueFromPipeline, Mandatory)]
        [object]$Value
    )

    process
    {
        [pscustomobject]@{
            Type     = $Value.GetType().FullName
            IsObject = $Value -is [object]
        }
    }
}
PS /> 1, 'foo', (Get-Date) | Test-Type

Type            IsObject
----            --------
System.Int32        True
System.String       True
System.DateTime     True
于 2021-12-27T22:21:19.517 回答
1

解决这个问题的正确方法是创建一个ParameterSet

Function doRESTcall(){
    [CmdletBinding()]
            param (
                [Parameter(Mandatory=$true, ParameterSetName = 'StringBody', Position = 0)]
                [Parameter(Mandatory=$true, ParameterSetName = 'HashBody', Position = 0)]
                [Hashtable]$headers,
                [Parameter(Mandatory=$true, ParameterSetName = 'StringBody', Position = 1)]
                [String]$Stringbody,
                [Parameter(Mandatory=$true, ParameterSetName = 'HashBody', Position = 1)]
                [Hashtable]$Hashbody
            )
    Write-Host 'Parameter set:' $PSCmdlet.ParameterSetName
    Write-Host 'StringBody:' $StringBody
    Write-Host 'HashBody:' $HashBody
}

doRESTcall -?

NAME
    doRESTcall

SYNTAX
    doRESTcall [-headers] <hashtable> [-Hashbody] <hashtable> [<CommonParameters>]

    doRESTcall [-headers] <hashtable> [-Stringbody] <string> [<CommonParameters>]


ALIASES
    None


REMARKS
    None

doRESTcall @{a = 1} 'Test'

Parameter set: StringBody
StringBody: Test
HashBody:

注意:要接受更多种类的字典(如[Ordered]),我会为相关参数使用[System.Collections.Specialized.OrderedDictionary](而不是[Hashtable])类型。

于 2021-12-28T10:18:56.133 回答