Powershell передает обязательную переменную динамического типа в функцию

Я реализую функцию в Powershell, которая будет выполнять вызовы REST. Один из параметров может отличаться по содержанию, в зависимости от заданных сценариев. Например, bodyпринадлежащий RESTcall может быть строкой или хеш-таблицей. Как вы реализуете это в рамках CmdletBinding()декларация?

Например

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

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

Правильный способ решить эту проблему - создать 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]) для соответствующих параметров.

Другие вопросы по тегам