传递给 Invoke-Command 的属性将类型从 IDictionary 更改为 HashTable

2024-04-21

我运行时遇到错误Invoke-Command其中脚本块采用字典类型的参数:

无法处理参数“字典”的参数转换。 无法转换类型的“System.Collections.Hashtable”值 输入“System.Collections.Hashtable” “System.Collections.Generic.IDictionary`2[System.String,System.String]”。 行:7 字符:1 + 调用命令-计算机名。 -ArgumentList $dictionary -ScriptBlock ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidData: (:) [], ParameterBindin...mationException + FullQualifiedErrorId : 参数参数转换错误 + PS 计算机名 : 本地主机

经过大量挖掘后,我能够将脚本简化为下面的 MVP,以显示此问题的根源:

[System.Collections.Generic.IDictionary[string, string]]$dictionary = New-Object -TypeName 'System.Collections.Generic.Dictionary[string, string]' 
$dictionary.Add('one', 'hello')
$dictionary.Add('two', 'world')
Write-Verbose "Main Script $($dictionary.GetType().FullName)" -Verbose #outputs: VERBOSE: Before System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
Invoke-Command -ComputerName . -ArgumentList $dictionary -ScriptBlock {
    Param (
        #[System.Collections.Generic.IDictionary[string, string]] #if I leave this in I get a conversion error
        $dictionary
    )
    Write-Verbose "Function before $($dictionary.GetType().FullName)" -Verbose #outputs: VERBOSE: After System.Collections.Hashtable
    function Poc {} #this line seems to cause the `$dictionary` to become a HashTable
    Write-Verbose "Function after $($dictionary.GetType().FullName)" -Verbose #outputs: VERBOSE: After System.Collections.Hashtable

}

看来如果脚本块为Invoke-Command包含任何内联函数,则参数会自动转换为HashTable;而如果脚本块不包含任何嵌套函数定义,则参数将保留为System.Collections.Generic.IDictionary[string, string].

我是否滥用了此功能/是否有常见的解决方法?或者这只是 PowerShell 中的一个错误?


你正在看到一个设计限制基于 XML 的序列化基础设施PowerShell 的基础remoting https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Remote(这是什么Invoke-Command -ComputerName是基于):

  • 实现该类型的对象IDictionary https://docs.microsoft.com/en-US/dotnet/api/System.Collections.IDictionary接口被反序列化为仅两种非通用类型之一(即使原始的完整类型名称是recorded在序列化数据中),即:

    • In PowerShell 7.3.0 and above only (see below), [ordered] hashtables (System.Collections.Specialized.OrderedDictionary https://docs.microsoft.com/en-US/dotnet/api/System.Collections.Specialized.OrderedDictionary) if and only if that precise type was used as input.[2]

    • [hashtable] (System.Collections.Hashtable https://docs.microsoft.com/en-US/dotnet/api/System.Collections.Hashtable) for 所有其他字典类型, 包括generic类型如[System.Collections.Generic.IDictionary[string, string]]就你而言;该类型的键和值[object]-typed.

Such 潜在的失去类型保真度是 PowerShell 远程处理所固有的,因为只有有限的一组众所周知的类型忠实地反序列化,因为我们的想法是让远程处理能够跨不同的 PowerShell 版本以及现在在两个 PowerShell 之间工作editions. See 这个答案 https://stackoverflow.com/a/59180367/45375有关 PowerShell 序列化的系统概述。

For 然而,字典类型的基本用法,类型保真度的损失应该不重要: 感谢IDictionary接口、枚举、条目访问和获取条目计数的工作原理都是相同的。

然而,在PowerShell 7.2.x 及更低版本,包括在Windows PowerShell, [ordered]哈希表被错误地反序列化为无序的 [hashtable]s,这明显丢失了其条目的原始顺序并阻止了条目访问位置性的反序列化对象上的索引。

  • See GitHub 问题 #2861 https://github.com/PowerShell/PowerShell/issues/2861#issuecomment-318525355对于原始错误报告..

  • 如前所述,这问题已在 v7.3.0 中修复 (see GitHub 公关 #15545 https://github.com/PowerShell/PowerShell/pull/15545).

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

传递给 Invoke-Command 的属性将类型从 IDictionary 更改为 HashTable 的相关文章

随机推荐

  • Z3:检查模型是否唯一

    Z3 有没有办法证明 表明给定模型是唯一的并且不存在其他解决方案 一个小例子来演示 declare const a1 Int declare const a2 Int declare const a3 Int declare const b
  • asp.net mvc 镜像路径和虚拟目录

    我知道这必须是重复的 但我一直在翻阅大量有关此的信息 但无法使其发挥作用 我正在尝试让一个网站在客户端的服务器上运行 并且他们将该网站安装在虚拟目录中 我本地没有这个设置 所以我在这里盲目飞行 我正在尝试建立一条通往图像的路径 用于 Fac
  • 我应该如何处理Java中非常大的数组?

    我有一个算法 当前分配一个非常大的双精度数组 它经常更新和搜索 数组的大小为 N 2 2 其中 N 是算法运行的行数 我还必须保留整个内容的副本 以用于与算法周围的应用程序相关的目的 当然 这对我的算法可以处理的行数施加了限制 因为我需要应
  • 用于单个测试的 Rails/RSpec 切换缓存

    因此 在我的应用程序中 我可以禁用所有测试的缓存 这将是理想的 但显然有许多遗留测试依赖于缓存的功能 有没有办法为单个 RSpec 测试启用 Rails 缓存 就像是 before each do cache setting Rails c
  • 如何让 Jenkins 在 Maven 2 构建上 --fail-fast?

    我正在尝试使用 Jenkins 构建一个多模块 Maven 项目 当我在命令行使用相同的环境 variables settings xml user 正如 Jenkins 所做的那样 测试失败会导致构建立即失败 Failed tests t
  • 如何从 SQL Server 表中恢复已删除的行?

    我不小心对 WHERE 错误的表运行了 DELETE 命令 条款 我正在使用 SQL Server 2005 有没有办法可以帮助我恢复丢失的数据 可以使用 Apex 恢复工具 我已成功恢复我不小心删除的表行 如果您下载试用版 它将仅恢复第
  • Swagger UI 未在 index.html 页面上显示任何内容

    已更新以下解决方案 感谢下面 Ron 的建议 我稍微修改了我的设置以使用 BeanConfig 而不是 SwaggerConfig 并使其正常工作 为了做到这一点 我必须修改 servlet 并且 这就是我认为缺少的部分 将 BeanCon
  • Spring querydsl 谓词:关系支持

    我有一个与联系人具有一对一关系的客户实体 如果我想获取客户名称 我需要写 client getContact getLastName 我使用 querydsl lib 来过滤 Spring Boot 应用程序中的客户端列表 api clie
  • 将 PNG 从预乘 alpha 转换为传统的 alpha 透明度?

    我在处理一些具有预乘 Alpha 的 PNG 格式的源图像时遇到了很大的困难 因为大多数工具根本无法正确支持它 有没有什么可以将 最佳猜测 转换为更传统的PNG 如果 预乘 alpha 指的是 iOS 的 PNG 衍生品 那么您可以将它们转
  • 如何统计 Redis 流中未读或已确认的消息?

    使用 Redis 5 0 3 假设我们创建一个名为streamy和一个消费群体consumers XGROUP CREATE streamy consumers MKSTREAM 然后向其中添加一些消息 XADD streamy messa
  • 当轴数已知时,X.ravel() 和 X.reshape(s0*s1*s2) 之间的差异

    看到这个answer https stackoverflow com a 28930580 3904031我想知道X的展平视图的创建是否本质上是相同的 只要我知道X中的轴数是3 A X ravel s0 s1 s2 X shape B X
  • Backbone.js 收集抛出错误

    我 作为初学者 正在制作一个小型骨干函数来附加我的链接 为此我使用要分配模型的集合 但集合抛出错误 任何人都可以纠正我的代码吗 function var Model new Backbone Model data name Yahoo hr
  • 工具条(ToolStripDropDownButton)关闭并失去窗口焦点

    我有一个带有 ToolStripDropDownButton 的 ToolStrip 这又会弹出一个带有 DateTimePicker 的 UserControl 当我单击日历上的顶部数字 绿色 时 一切正常 用户控件保持打开状态 当我单击
  • 如何将 Express 部署到 Firebase?

    目前我正在学习express和Firebase 我可以将 Angular 或 React 页面 前端 部署到 Firebase 现在 我正在尝试使用 Express 创建后端 然后我意识到 我不能简单地将其作为另一个项目部署到 Fireba
  • 为什么 Firebase 电子邮件验证不起作用?

    btn1 on click function e e preventDefault lt disable form submit const email signupForm signup email value const passwor
  • 将 TIFF 转换为 1 位

    我编写了一个桌面应用程序 可将 8 位 TIFF 转换为 1 位 但输出文件无法在 Photoshop 或其他图形软件 中打开 该应用程序的作用是 它对原始图像的每 8 个字节 每个像素 1 个字节 进行迭代 然后将每个值转换为 bool
  • 通过 Google 表格中的应用程序脚本访问并恢复到特定(最好是命名)修订

    我没有找到使用 Drive Rest Revisions 方法与 Google Sheet 的 命名 版本进行交互的方法 或者将特定修订移至头部 我正在尝试弄清楚如何在编辑器进行编辑并完成后将命名修订移至头部 在完成触发后 我希望脚本 除其
  • 如何使用 android.support.transition.Transition/TransitionSet 作为片段共享元素进入/返回过渡?

    Google 刚刚发布了 android support transition 包 它提供了对其转换框架的向后移植 这真的很棒 https developer android com reference android support tr
  • 如何在 acumatica 中使用 webservices api 导出数据时设置超时

    这是第一个场景 我使用 webservices api 在 acumatica 系统中创建新的 账单 文档到账单和调整屏幕 AP301000 之后 我需要使用网络服务加载当前屏幕 AP301000 的 应用程序 选项卡菜单中的所有文档记录
  • 传递给 Invoke-Command 的属性将类型从 IDictionary 更改为 HashTable

    我运行时遇到错误Invoke Command其中脚本块采用字典类型的参数 无法处理参数 字典 的参数转换 无法转换类型的 System Collections Hashtable 值 输入 System Collections Hashta