Powershell передает обязательную переменную динамического типа в функцию
Я реализую функцию в Powershell, которая будет выполнять вызовы REST. Один из параметров может отличаться по содержанию, в зависимости от заданных сценариев. Например,
body
принадлежащий
REST
call может быть строкой или хеш-таблицей. Как вы реализуете это в рамках
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]
) для соответствующих параметров.