gpt4 book ai didi

validation - 如何让参数强制适用于添加的 ScriptMethod 成员?

转载 作者:行者123 更新时间:2023-12-02 23:43:31 25 4
gpt4 key购买 nike

我有和 $object 我想内置函数。我似乎无法弄清楚如何对添加功能的参数强制执行规则。

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

 $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你可以看到 Mandatory参数被保留,它似乎被忽略了。

解决方法

一个简单的测试

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

$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 中创建一个接受相同参数的脚本 block ,然后在调用它时将所有绑定(bind)的参数作为参数传递给脚本 block 。

我没有使用更复杂的参数声明对其进行测试,但它应该可以解决问题。

我认为这样做的主要缺点是您需要编写两次 param block 。如果您在 Add-Member 之外创建脚本 block ,有一种方法可以避免这种情况。称呼;您可以创建一个将脚本 block 作为参数的函数,然后使用 AST 对其进行解析并以编程方式创建一个嵌入并执行原始脚本 block 的新脚本 block 。这可能有点矫枉过正。也许我会写一篇关于它的博客文章。

关于validation - 如何让参数强制适用于添加的 ScriptMethod 成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33225763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com