Validation 如何让添加的ScriptMethod成员使用参数强制?

Validation 如何让添加的ScriptMethod成员使用参数强制?,validation,powershell,object,methods,parameters,Validation,Powershell,Object,Methods,Parameters,我有和$object,我想有内置函数。我似乎不知道如何对添加函数的参数强制执行强制规则 强制规则适用于与对象不关联的标准函数,但当我测试对象并运行函数时,我可以在没有所需强制参数的情况下执行 $object | Add-Member -Name ProcessFiles -MemberType ScriptMethod -Value { param( [Parameter(Mandatory=$true)] [String[]]$FILES )

我有和$object,我想有内置函数。我似乎不知道如何对添加函数的参数强制执行强制规则

强制规则适用于与对象不关联的标准函数,但当我测试对象并运行函数时,我可以在没有所需强制参数的情况下执行

 $object | Add-Member -Name ProcessFiles -MemberType ScriptMethod -Value { 
    param(
        [Parameter(Mandatory=$true)]
        [String[]]$FILES
    ) 
$object.ProcessFiles()  
这不会引发错误,它应该抱怨缺少参数

 $object | Add-Member -Name ProcessFiles -MemberType ScriptMethod -Value { 
    param(
        [Parameter(Mandatory=$true)]
        [String[]]$FILES
    ) 
$object.ProcessFiles()  

有什么魔力?有人有自定义对象ScriptMethod参数验证的示例代码吗?

这很有趣。我可以确认您看到的行为(使用PowerShell 5.0,但我想整个过程都是一样的)

我不能确切地说为什么会发生这种情况,但这一定与代码的调用方式有关

通过执行
$object.ProcessFiles.Script.Ast.ParamBlock.Parameters.Attributes
,您可以看到
必需的
参数被保留了下来,它似乎被忽略了

权变措施 简单的测试 如果您不需要强制参数的所有功能(也就是说,您不关心它是否提示输入值),您可以简单地测试并抛出:

$object | Add-Member -MemberType ScriptMethod -Name test -Value { 
    param(
        [String[]]
        $Files
    )

    if (!$Files) {
        throw [System.ArgumentException]'-Files is required.'
    }
}
更一般的东西 在调查这一点时,我注意到一个
[ScriptBlock]
确实强制执行了这些属性,因此我想出了以下方法:

$object | Add-Member -MemberType ScriptMethod -Name ProcessFiles -Value { 
    param(
        [String[]]
        $Files
    )

    & {
        param(
            [Parameter(Mandatory=$true)]
            [String[]]
            $Files
        )

        $Files
    } @PSBoundParameters
}
这是在ScriptMethod内创建一个脚本块,该脚本块接受相同的参数,然后在scriptblock调用时将所有绑定参数作为参数传递给scriptblock

我没有用更复杂的参数声明来测试它,但它应该可以做到这一点


我认为这样做的主要缺点是需要编写两次param块。如果在
addmember
调用之外创建脚本块,有一种方法可以避免这种情况;您可以创建一个以scriptblock为参数的函数,然后使用AST对其进行解析,并以编程方式创建一个新的scriptblock,该scriptblock嵌入并执行原始scriptblock。这可能有点过头了;也许我会为此写一篇博文。

谢谢你的意见。这听起来像是某种错误。我想我会用你建议的“简单变通”来做输入检查。显然,我只是希望依靠内置的魔法,但看起来我必须召唤我自己的巫术。