未显示所有属性

2024-01-05

当我们尝试通过管道将数据导出到其他函数时,我们在 PowerShell 中观察到一些奇怪的行为。

示例代码:

$Array = @()

$Obj1 = [PSCustomObject]@{
    Member1   = 'First'
    Member2   = 'Second'
}

$Obj2 = [PSCustomObject]@{
    Member1   = 'First'
    Member2   = 'Second'
    Member3   = 'Third'
}

$Array = $Obj1, $Obj2
$Array | Out-GridView -Title 'Not showing Member3'

$Array = $Obj2, $Obj1
$Array | Out-GridView -Title 'All members correctly displayed'

在上面的例子中你可以看到当第一个对象只包含 2properties, the Out-GridViewCmdLet(和其他)仅显示 2properties,即使第二个对象有 3properties。但是,当数组中的第一个对象有 3properties它确实正确地显示了它们。

有没有解决的办法?因为无法预先预测有多少properties在一个物体上将会有,并且如果该物体具有最多properties将是第一个array.


我曾经有过同样的经历并创建了以下可重复使用的'Union' 功能:

# 2021-08-25 Removed Union function

Usage:

$Obj1, $Obj2 | Union | Out-GridView -Title 'Showing all members'

它还应该适用于复杂的对象。一些标准 cmdlet 会一次输出多个对象类型,如果您查看它们(例如Out-GridView)或将它们转储到文件中(例如Export-Csv)你可能会错过很多属性。再举个例子:

Get-WmiObject -Namespace root/hp/instrumentedBIOS -Class hp_biosSetting | Union | Export-Csv ".\HPBIOS.csv"

2014年9月19日添加:

也许这已经是评论的字里行间了$Array | Select * | …不会解决问题,但会专门选择属性$Array | Select Member1, Member2, Member3 | … does.
此外,虽然在大多数情况下Union函数将起作用,但有一些例外,因为它只会对齐first与其余的对象。 考虑以下对象:

$List = @(
    New-Object PSObject -Property @{Id = 2}
    New-Object PSObject -Property @{Id = 1}
    New-Object PSObject -Property @{Id = 3; Name = "Test"}
)

If you Union这个对象一切似乎都很好,如果你例如ExportTo-CSV并与export .csv从那时起你的文件将永远不会有任何问题。

$List | Union
Id Name
-- ----
 2
 1
 3 Test

但仍然存在一个问题,因为只有第一个对象被对齐。如果你例如对结果进行排序Id (Sort Id) 或仅取最后 2 个 (Select -Last 2)条目,Name未列出,因为第二个对象不包含Name财产:

$List | Union | Sort Id
Id
--
 1
 2
 3

因此我重写了Union-Object (Alias Union) 函数`):

联合对象

# 2021-08-25 Removed Union-Object function

Syntax:

$Array | Union | Out-GridView -Title 'All members correctly displayed'

更新2021-08-25

Based on az1d https://stackoverflow.com/users/827369/az1d helpful feedback on an error caused by equal property names with different casing, I have created a new UnifyProperties function.
(I will no longer use the name UnionObject for his)

function UnifyProperties {
  $Names = [System.Collections.Generic.HashSet[string]]::new([StringComparer]::OrdinalIgnoreCase)
  $InputCollected = @($Input)
  $InputCollected.ForEach({ 
    foreach ($Name in $_.psobject.Properties.Name) { $Null = $Names.Add($Name) }
  })
  $inputCollected | Select-Object @($Names)
}

Usage:

[pscustomobject] @{ one = 1; two = 2; three = 3 },
[pscustomobject] @{ ONE = 10; THREE = 30; FOUR = 4 } |
    UnifyProperties

one two three FOUR
--- --- ----- ----
  1   2     3
 10        30 4

也可以看看:#13906将 -UnifyProperties 参数添加到 Select-Object https://github.com/PowerShell/PowerShell/issues/13906

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

未显示所有属性 的相关文章

随机推荐

  • 在 winforms 中创建可点击的 C# 图像映射

    我正在尝试开发一个基本的 C winforms 应用程序 以可点击的图像地图作为其焦点 也就是说 某个部分可单击并将打开一个新表单的图像 例如 图像可以是棋盘 单击某个方块将执行打开新表单的操作 我希望这个概念是清楚的 我在 S O 上看过
  • 有没有办法在 Rails 3.1 中检测用户代理[重复]

    这个问题在这里已经有答案了 可能的重复 自动检测移动浏览器 通过用户代理 https stackoverflow com questions 1005153 auto detect mobile browser via user agent
  • 在 csproj 中将程序集标记为 CLSCompliant

    对此的回复question https stackoverflow com questions 42810705 visual studio 2017 and the new csproj internalsvisibleto解释了如何设置
  • 如何使用PhoneGap读写内部数据库?

    我有一个内部 SQLite DB Assets 我在其中存储了 100 个用户名和相应密码的文件夹 我如何通过phoneGap 访问它 我读过了 http docs phonegap com en 1 6 1 cordova storage
  • Selenium Webdriver - 等待页面在 Java&JavaScript(ajax/jquery/animation 等)中完全加载

    我正在尝试构建一种更好的方法来等待每次单击后加载页面 目前我使用的是这样的 public boolean waitForJSandJQueryToLoad WebDriverWait wait new WebDriverWait webDr
  • 按密度拆分的 APK 仍包含所有资源

    我决定尝试 apk sliptting 来减小 apk 的大小 我将以下内容添加到我的 gradle 构建文件中 splits Configures multiple APKs based on screen density density
  • 闪存记录 API

    谁能为 Flash AIR Flex 推荐一个好的 AS3 日志记录 API 除了编码事件之外 我还需要一些东西来捕获和记录鼠标和键盘事件 最好是有详细记录 支持的东西 提前致谢 我一直在使用霹雳 http code google com
  • 使用composer只需要1个文件?

    是否可以只需要 Composer 包中的 1 个文件 我只需要包中的 1 个或几个文件 当我只使用几个文件时 要求包含数百个文件的整个包是毫无意义的 可以通过作曲家来做到这一点吗 可以使用以下命令将特定文件包含在当前包中files自动加载策
  • Coredata非常慢;迅速

    我制作了一个 iOS 应用程序来跟踪设备的 GPS 路线 问题是 当我跟踪超过 5 分钟时 coredata 需要很长时间才能保存 我保存一个名为会话的对象 会话有很多位置对象 位置对象是 纬度 经度 会话对象看起来像 名称 string
  • Google Play Billing:如何模拟“帐户保留”状态(在调试/沙盒模式下)

    2020 年 11 月之前 Google Play 上的 Android 应用必须管理 帐户保留 状态 https developer android com distribute play policies https developer
  • AWS Fargate 中的文件

    是否可以在 Fargate 中实际写入 编辑 删除文件 由于它是无服务器的并且实际上没有文件系统 对此我无法得到明确的答案 例如 我们的一个客户需要在本地容器上写入一些临时缓存文件 这可能吗 我不想为此设置整个数据容器卷 Thanks Fa
  • 反序列化期间忽略属性

    我有一个非常好的序列化类 终于 现在我想向此类添加一个属性 但我根本不想将其序列化 是否可以添加带有某种属性的新属性 以便当我调用序列化或反序列化方法时 该属性将被忽视 XmlIgnore public int DoNotSerialize
  • 您最常重用的课程是什么?

    一段时间后 每个程序员都会得到一组实用程序类 其中一些是真正的编程珍珠 并且可以在您的多个项目中重复使用 例如 在java中 class Separator private String separator private boolean
  • php中如何将多个数组混合到一个数组中

    我正在从数据库获取数组 但它创建了多个数组 我只需要数据库中的一个数组 现在我只想从多个数组创建一个数组 我从数据库中获取了数组 Array 0 gt Array 0 gt 1 pro ref id gt 1 1 gt Array 0 gt
  • 通过 MinGW 上的 Swig/Python 以二进制模式使用 C++ 标准流

    我有一个用 C 编写的库 它使用标准流来读取和写入对象 我还有一个用 Swig 生成的 Python 接口 我用它来访问该库 在 Linux 上一切正常 但在 Windows 在 MinGW 上 上似乎不可能通过 Python 接口以二进制
  • 如何使用 netty 通过 HTTP 传输响应

    我正在使用 Netty 3 6 6 我想向调用者发送一个大的响应 我无法将响应正文复制到 ChannelBuffer 中 因为在某些情况下它会非常大 我正在将服务器从CXF迁移到Netty 以前 我只能使用CXF提供的OutputStrea
  • 为什么将 Count 与 IQueryable 一起使用被认为是不可行的

    如果我有以下代码 IQueryable
  • 如何即时更新 Eclipse 模板变量?

    我通过扩展点添加了以下新的 Eclipse 模板 它只是添加一个示例模板testTag tag
  • 一个身体可以在另一个身体里面吗?

    是否可以在外部 tbody 中包含内部 tbody 如下所示 这是一个 CSS 示例 这是示例 HTML table tbody class class1 tr td td td td tr tbody class class2 tr td
  • 未显示所有属性

    当我们尝试通过管道将数据导出到其他函数时 我们在 PowerShell 中观察到一些奇怪的行为 示例代码 Array Obj1 PSCustomObject Member1 First Member2 Second Obj2 PSCusto