使用自定义PowerShell定义的类型进行参数类型规范

时间:2010-09-03 11:09:53

标签: powershell

我使用New-Object定义自定义PowerShell类型。我希望参数是我定义的类型,是否可以以声明方式指定此类型?下面的代码给出了错误:“无法找到类型[BuildActionContext]:确保加载包含此类型的程序集。”

我们可以指定声明类型,还是应该只测试指定对象的类型?

不工作代码:

$buildActionContext = New-Object -TypeName PSObject -Property @{
# Given properties
BuildAction = "Build"; 
}
$buildActionContext.PSObject.TypeNames.Insert(0, 'BuildActionContext')

function DoSomethingWithBuildActionContext
{
[CmdletBinding()]
param
(
    [Parameter(Mandatory=$true)][BuildActionContext]$Context
)

Write-Host "Build action: $($Context.BuildAction)"
}

DoSomethingWithBuildActionContext -Context $buildActionContext

工作代码,但可以采用不同的方式:

$buildActionContext = New-Object -TypeName PSObject -Property @{
        # Given properties
        BuildAction = "Build"; 
    }
    $buildActionContext.PSObject.TypeNames.Insert(0, 'BuildActionContext')

function DoSomethingWithBuildActionContext
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory=$true)]$Context
    )

    if ($Context.PSObject.TypeNames[0] -ne 'BuildActionContext')
    {
        throw "Context parameter not of type 'BuildActionContext'"
    }

    Write-Host "Build action: $($Context.BuildAction)"
}

DoSomethingWithBuildActionContext -Context $buildActionContext
DoSomethingWithBuildActionContext -Context "Hello world"

注意:第二次调用会给出异常消息。

2 个答案:

答案 0 :(得分:6)

我希望只有真正的.NET类型可用于指定参数类型。根据{{​​3}},自定义类型名称主要用于格式化。

您可以通过ValidateScript属性手动检查类型名称:

function DoSomethingWithBuildActionContext { 
  param(
    [Parameter()]
    [ValidateScript({ $_.PSObject.TypeNames[0] -eq 'BuildActionContext' })]
    $context
  )
  Write-Host "Build action: $($Context.BuildAction)"
}

答案 1 :(得分:0)

好问题。我试过了

$buildActionContext -is [BuildActionContext]

得到

Unable to find type [BuildActionContext]: make sure that the assembly containing this type is loaded.

您在第一个示例中遇到的错误是什么。在我的头脑中,我想为这种类型创建一个C#对象,但这可能有点过头了。

我会继续搜索。