PowerShell:GetNewClosure() 和带验证的 Cmdlet

2023-11-30

我试图了解 .GetNewClosure() 如何在 PowerShell 2 中的脚本 cmdlet 上下文中工作。

本质上,我有一个返回对象的函数,如下所示:

function Get-AnObject {
param(
    [CmdletBinding()]
    [Parameter(....)]
    [String[]]$Id
    ..
    [ValidateSet('Option1','Option2')]
    [String[]]$Options
)

...

    $T = New-Object PSCustomObject -Property @{ ..... } 
    $T | Add-Member -MemberType ScriptProperty -Name ExpensiveScriptProperty -Value {
        $this | Get-ExpensiveStuff
    }.GetNewClosure() 

..
}

如果我没有验证集选项,则闭包似乎工作正常。但是,如果包含它,新的关闭将失败并出现以下错误。

使用“0”个参数调用“GetNewClosure”时发生异常:“无法添加属性,因为它会导致具有值的变量选项变得无效。”

据推测,闭包正在尝试捕获 Cmdlet 调用的上下文。由于参数“Options”根本没有绑定,这对于参数验证来说不太好。

我想可以通过将验证作为代码放置在 Cmdlet 主体中而不是使用 [Validate*()] 装饰器来避免这种情况 - 但这看起来很令人讨厌并且相当晦涩。有没有办法融合这两种想法?


“无法添加属性”消息是(或曾经是)一个 PowerShell 错误,我已将其提交给 Microsoft这个错误报告。这个特定问题似乎已经得到解决(可能在 V5.1 左右)。但任何对 Powershell 闭包感兴趣的人可能仍然会发现下面的信息很有趣。

有一个适用于早期版本的解决方法,但首先这里有一个简化的重现案例,它会产生相同的错误:

function Test-ClosureWithValidation {
    [CmdletBinding()]
    param(
        [Parameter()]
        [ValidateSet('Option1','Option2')]
        [String[]]$Options
    )
    [scriptblock] $closure = {"OK"}.GetNewClosure();
    $closure.Invoke()
}

Test-ClosureWithValidation -Options Option1

解决方法取决于 GetNewClosure() 通过迭代来工作的事实局部变量在调用脚本的上下文中,将这些局部变量绑定到脚本的上下文中。出现该错误是因为它复制了$Options变量包括验证属性。您可以通过创建仅包含所需局部变量的新上下文来解决该错误。在上面的简单重现中,这是一种单行解决方法:

    [scriptblock] $closure = &{ {"OK"}.GetNewClosure();}

上面的行现在创建了一个没有局部变量的作用域。对于您的情况来说,这可能太简单了;如果您需要外部作用域中的一些值,只需将它们复制到新作用域中的局部变量中,例如:

    [scriptblock] $closure = &{ 
        $options = $options; 
        {"OK $options"}.GetNewClosure();
    }

请注意,上面的第二行创建了一个新的 $options 变量,并将其分配给value外部变量的属性不会传播。

最后,我不确定在您的示例中为什么您需要调用 GetNewClosure 。变量 $this 不是普通的局部变量,无论您是否创建闭包,它都将在您的脚本属性中可用。例子:

function Test-ScriptPropertyWithoutClosure {
    [CmdletBinding()]
    param(
        [Parameter()]
        [ValidateSet('Option1','Option2')]
        [String[]]$Options
    )
    [pscustomobject]@{ Timestamp= Get-Date} | 
        Add-Member ScriptProperty ExpensiveScriptProperty { 
            $this | get-member -MemberType Properties| % Name 
        } -PassThru
}

Test-ScriptPropertyWithoutClosure -Options Option1 | fl
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PowerShell:GetNewClosure() 和带验证的 Cmdlet 的相关文章

  • CMD 或 Powershell 命令组合(合并)两个文件中的相应行[重复]

    这个问题在这里已经有答案了 是否可以使用 CMD 和 Powershell 将 2 个文件合并为 1 个文件 如下所示 file1 line1 tab file2 line1 file1 line2 tab file2 line2 file
  • Powershell - 函数中的匹配 - 返回时获得额外的 true/false

    为什么我在这个函数的结果上得到提取 True 或 False 当我想要返回的只是邮政编码时 Function GetZipCodeFromKeyword String keyword pattern d 5 keyword match pa
  • 如何使用 Cerberus 返回自定义规则名称/错误代码?

    正在验证 csv文件 我想以用户习惯的格式给出验证结果 为了利用Cerberus https docs python cerberus org en stable index html 我让用户在一个中定义验证规则 yaml file 架构
  • LINQ2SQL:如何实现通用最大字符串长度验证?

    LINQ2SQL 中的一个常见问题是 虽然 NET 字符串允许为其变量分配任意长度 但您的数据库可能具有特定的最大长度约束 如 VARCHAR 5 这将导致 SQL 错误消息 字符串或二进制数据将被截断 这是非常没有帮助的 因为它不会告诉您
  • PowerShell,如何在现有浏览器选项卡中打开 URL?

    我想制作一个 powershell 脚本 它将 运行 Chrome 打开 google com 网站 停留一段时间 在同一选项卡中从 google com gt bing com 转到 这就是适合我的代码 它运行 Chrome 并在选项卡中
  • 为什么乘法不适用于 Read-Host 值

    table num Read Host Prompt Enter the table number you want to get printed for i 1 i lt 11 i ans table num i write table
  • Java,根据 WSDL 中的嵌入模式验证 XML

    我有一个 wsdl具有嵌入架构的文件 我想使用它来验证 XML 文件 字符串 wsdl文件 与验证的方式相同 xsd 该架构位于
  • Groovy:验证 JSON 字符串

    我需要检查 Groovy 中的字符串是否为有效的 JSON 我的第一个想法就是把它发送出去new JsonSlurper parseText myString 并且 如果没有例外 就假设它是正确的 然而 我发现 Groovy 很乐意接受尾随
  • 如何使用 SQL 查询在 Access 中的字段上设置验证规则?

    我正在使用 MS Access 2016 Office 365 目前遇到问题 下面是一个演示此问题的示例 这里我创建了一个表 名为节点家庭链接 由两个字段组成 NodeID 和 FamilyID 如下所示 现在 NodeID 是从另一个表
  • Powershell:如何获取从 PsJob 内运行的进程返回的退出代码?

    我在 powershell 中有以下工作 job start job c utils MyToolReturningSomeExitCode cmd ArgumentList JobFile 如何访问返回的退出代码c utils MyToo
  • Swagger 生成 javascript-closure-angular-client

    我是 swagger 的新手 我从 swagger 的在线编辑器生成了一个 javascript 闭包角度客户端 它给了我一个 DefaultAPI js 和其他与我的对象定义匹配的 JS 文件 我在 swagger 文档和网上搜索了一种在
  • 带有 UiPath 的 Powershell

    我正在使用 UiPath 启动 PowerShell 脚本 我需要从 UiPath 传递一个参数 首先这可能吗 其次有人有这方面的例子吗 不确定 PowerShell 脚本中的语法是什么 是否可以将参数从 UiPath 传递到终端 您的 P
  • 用于验证 IIS 设置的 Powershell 脚本

    是否可以使用 Power Shell 脚本获取 IIS 设置 我希望使用脚本获取 检查以下信息 检查 Windows 身份验证提供程序是否正确列出 协商 NTLM 检查是否启用了 Windows 身份验证 Windows 身份验证高级设置
  • 使用 jQuery 检查输入是否为空

    我有一个表单 我希望填写所有字段 如果单击某个字段然后未填写 我想显示红色背景 这是我的代码 apply form input blur function if input text is empty this parents p addC
  • 启动 psexec 后获取进程 ID

    我有一个使用 psexec 在远程计算机上调用记事本的脚本 有什么办法可以在启动后获取进程ID吗 这是我所拥有的 PCname MyPC SessionID 2 Program Notepad exe FilePath C temp Fil
  • Powershell 脚本无法从 SCCM 正常运行 [已关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 回形针不支持 .doc 文件

    在 Rails 4 0 2 中 我使用回形针 gem 上传文件 但它不支持 doc 文件 在文件上传字段下方 显示一条错误消息 扩展名与其内容不匹配 在模型中 检查内容类型的验证如下 validates attachment content
  • MVC 模式中的验证层

    验证模型将使用的数据的最佳位置在哪里 例如 考虑登记表 我们有一些来自注册表的数据 那么验证这些数据的最佳位置在哪里 我们应该通过 if 语句或特殊的验证器类来检查每个数据 这意味着大量的编码 所以我想了解在哪里可以做到这一点 在控制器中
  • Angular 模板验证表单

    我正在研究表单验证 我正在使用模板驱动的验证表单 其编码如下 现在工作正常 但是当我尝试添加时 username ngModel and password ngModel 在创建验证类的输入中 它向我显示一个错误 也请找到该错误 div c
  • 禁用 notInArray 验证器 Zend Framework 2

    有没有办法在 Zend Framework 2 中禁用 notInArray Validator 互联网上的所有信息都显示如何在 Zend Framework 1 中禁用 notInArray Validator 例如以这种方式 如果您根本

随机推荐

  • 如何在 SQL Server 中声明全局变量..?

    我想对来自不同数据库的不同查询使用相同的值 like DECLARE GLOBAL VAR 1 INT Value 1 DECLARE GLOBAL VAR 2 INT Value 2 USE DB 1 GO SELECT FROM TAB
  • 生产中的 Rails 资产未得到服务(又一个资产问题)

    我在用着 阿帕奇2 2 15 乘客5 1 2 导轨 4 2 6 红宝石2 3 3 在 Rails 日志中 我得到 No route matches GET application xxxxx js 也 No route matches GE
  • Python-使用编解码器进行编码和解码,unicode_escape()

    我正在尝试使用 python 对文本进行编码和解码codecs图书馆 这是我的代码 gt gt gt import codecs gt gt gt codecs unicode escape encode my Text b my Text
  • 如何优化从 PyCBitmap 到 OpenCV 图像的转换

    我有这段代码 它可以工作 但它运行速度非常慢 hwin win32gui GetDesktopWindow width win32api GetSystemMetrics win32con SM CXVIRTUALSCREEN height
  • C++中什么是引用变量?

    C 中引用变量的简要定义是什么 A 参考是一个实体 是另一个实体的别名object A 参考不是一个variable as a variable仅通过声明引入object An object是一个存储区域 在 C 中 引用 不一定 不占用任
  • 根据 SFTP 修改日期下载文件

    有没有办法使用 Tamir SharpSsh 从 SFTP 服务器获取基于修改日期的文件 目前我正在按文件名下载文件 但我的要求是按修改日期 var sftp new Sftp Host UserName Password sftp Con
  • 当触摸位于外部时,AlertDialog 消失 [Android] [重复]

    这个问题在这里已经有答案了 我在我的应用程序上使用警报对话框 但当用户触摸它之外时它会一直隐藏 这是我的代码 public class DialogMessageEnd extends DialogFragment String winne
  • php/Mysql 查询插入日期失败

    我已经搜索了很长一段时间 但我不明白为什么我的查询不适用于日期 我希望它作为日期导入到我的数据库中 这是上级的选择 所以我在这里 insert query INSERT INTO enrties datum VALUES mysql rea
  • Java本地方法源代码[重复]

    这个问题在这里已经有答案了 哪里可以下载java原生方法源代码 比如我想知道源码System arraycopy 但我找不到 您可以下载OpenJdk源代码here 在文件夹中jdk src share你可以获得源代码 jdk src sh
  • KeyBindings 和 KeyListener 之间的区别

    如果您可以这样做 那么 KeyBindings 的意义何在 Imports public void Test JButton button1 JButton button2 JButton button3 Test button1 new
  • 如何在JQuery中进行算术运算?

    var price addprice val var pass pass val var total totalprice attr value var left leftquota attr value var balance balan
  • JDBC 中的 EntityManager 刷新模式

    JPA 本质上是 JDBC 的更高抽象 EntityManager 有一个 API setAutoFlushMode 它可以设置为 AUTO 或 COMMIT 在 JDBC 术语中 这相当于什么 谢谢 JDBC 也具有自动提交功能 它们都用
  • Ant build.xml需要用户输入,但Eclipse没有tty

    我正在尝试将 Eclipse 与我的 build xml 更好地集成 我的构建文件为程序的本机部分调用 GNU Make 并且 Makefile 使用 sudo 将编译的库移动到系统路径中 不幸的是 这需要输入密码 并且 Eclipse 的
  • 安全地检查变量的类型

    对于系统 我需要将指针转换为 long 然后将 long 转换回指针类型 正如您可以猜到的那样 这是非常不安全的 我想做的是使用dynamic cast来进行转换 所以如果我混合它们 我会得到一个空指针 这一页说http publib bo
  • rabbitmq-server安装CentOS - Erlang错误

    我有centos 6并尝试使用rpm安装rabbitmq 3 5 3 没有 yum 选项 这让我陷入了错误 root osboxes CentOS rpm Uvh rabbitmq server 3 5 3 1 noarch rpm war
  • C++ 自定义操作返回空字符串

    我们在 C 中的延迟自定义操作方面遇到问题 我们只需要自定义操作数据属性 apacheconfpath 的值 该属性目前具有测试的虚拟值 这是我们的 C 自定义操作 UINT stdcall AppendToApacheConfigFile
  • Unity2D:缩放游戏对象而不缩放其子对象

    我有一个敌人 里面有孩子 敌人也有死亡动画 在死亡动画中 使用动画师 我将敌人缩放到适当的大小 然而 敌人内部的孩子也被缩小 即使我在孩子上有一个动画 我已经调整了它的大小 我还在这个孩子上添加了锚点位置 有没有办法既能缩小敌人的规模 又能
  • Azure 事件中心 - 异地恢复:它是否复制到次要区域?

    根据微软的文章 https learn microsoft com en us azure event hubs event hubs geo dr 根据设计 事件中心异地灾难恢复不会复制数据 因此您无法在辅助事件中心上重复使用主事件中心的
  • Node.js 错误:找不到模块“请求”

    好的 这是一个常见的错误 我已经读过这篇文章node js 找不到模块 请求 请求模块安装在我的node modules中 我的完整节点应用程序是 var r require request var s r http www foo com
  • PowerShell:GetNewClosure() 和带验证的 Cmdlet

    我试图了解 GetNewClosure 如何在 PowerShell 2 中的脚本 cmdlet 上下文中工作 本质上 我有一个返回对象的函数 如下所示 function Get AnObject param CmdletBinding P