没有CmdletBinding(),动态参数无法正常工作。

3

这个参数似乎根本没有被"设置"为参数。验证设置无效,自动完成也无效。输入参数名称也不起作用。

我知道我以前使用过动态参数。但这一次,我漏掉了什么。只是想不出来是什么。

Function Add-Control() {
    DynamicParam {
        $ParamAttribute = New-Object Parameter
        $ParamAttribute.Mandatory = $true
        $ParamAttribute.ParameterSetName  = '__AllParameterSets'

        $AttributeCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute]

        $AttributeCollection.Add($ParamAttribute)

        $controlTypes = @("TextBox", "Label", "DataGrid")

        $AttributeCollection.Add((New-Object ValidateSet($controlTypes)))

        $RuntimeParam = New-Object System.Management.Automation.RuntimeDefinedParameter('Type', [string], $AttributeCollection)

        $RuntimeParamDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary

        $RuntimeParamDictionary.Add('Type', $RuntimeParam)

        return $RuntimeParamDictionary
    }

    Process {
        Write-Host ($PSBoundParameters['Type'])
    }
}

Add-Control -Type "Test"
# $null

@briantist 这个解决方案应该包含在问题中吗? - Božo Stojković
1
如果目的是让它对他人更有用,那么我认为它应该更易被发现。我原本想评论说,您可能还希望更清楚地了解任何错误消息,以更好地复制其他人在犯同样错误时可能看到的情况(而不仅仅是“它不起作用”)。无论如何,如果您不同意,可以回滚编辑。 - briantist
我并不完全不同意。但是我认为有些人可能会忽略这个问题,因为他们的代码中没有“CmdletBinding”,所以他们可能认为它不适用于他们。顺便说一下,在这种情况下没有错误(当然应该有)。 - Božo Stojković
1个回答

3

我不确定这是否是一个愚蠢的错误,但我确实感觉是这样。 我错过了什么。

[CmdletBinding()]
Param()

现在验证集和自动补全都可以使用。

希望这能帮助其他人。


显然,DynamicParam 块不应该被_悄悄忽略_。鉴于这个问题在 PowerShell Core v6.0.1 中仍然存在,我建议您在 GitHub 上报告此问题 - mklement0
1
我在UserVoice上提交了一个问题报告 - Božo Stojković
谢谢。UserVoice 是为 Windows PowerShell 设计的;为了在 PowerShell Core 中修复它,我已经在 GitHub 上提交了您的问题副本 - mklement0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接