【问题标题】:how to expand multiple properties when output contains @{<value1=xxx>,<value1=yyy> }?当输出包含 @{<value1=xxx>,<value1=yyy> } 时如何扩展多个属性?
【发布时间】:2021-06-02 00:59:42
【问题描述】:

我知道有很多关于扩展单个属性的帖子,希望这是一个简单的帖子,但由于选择字符串 -simplematch,我的输出看起来像这样

@{品牌=大众;型号=帕萨特}
@{品牌=福特;型号=蒙迪欧}

但是我该如何扩展这两个属性并让输出看起来像这样呢?

大众、帕萨特
福特、蒙迪欧

当我做一个选择对象 * 我得到下面但我似乎不能只得到值

忽略大小写:真
行号:1
线路:@{品牌=大众;型号=帕萨特}
文件名:输入流
路径:输入流
模式:@{品牌=大众;型号=帕萨特}
背景:
匹配:{}}

忽略大小写:真
行号:2
线路:@{品牌=福特;型号=蒙迪欧}
文件名:输入流
路径:输入流
模式:@{品牌=福特;型号=蒙迪欧}
背景:
匹配:{}}

【问题讨论】:

  • 我建议您注意documentation for Select-Object,特别是-ExpandProperty 参数。
  • 请允许我给你一个标准的建议:如果你 accept 一个答案,你将帮助未来的读者,向他们展示解决你的问题的方法。要接受答案,请单击答案左侧大数字下方的大 ✓ 符号(您将获得 2 点声望)。如果您至少有 15 个声望点,您还可以投票给其他有用的答案(也可以选择接受的答案)。如果您的问题尚未解决,请提供反馈,或者,如果您自己找到了解决方案,请self-answer
  • 我还鼓励您重新审视以前的问题并在适当的时候接受答案。

标签: powershell output select-string select-object


【解决方案1】:

补充Theo's helpful answer

tl;dr

# Note the use of -PipelineVariable obj and the use of $obj later.
PS> Write-Output -PipelineVariable obj (
      [pscustomobject] @{ Brand = 'Volkswagen'; Model = 'Passat' }, 
      [pscustomobject] @{ Brand = 'Ford'; Model = 'Mondeo' }
    ) |
      Select-String -SimpleMatch wagen |
        ForEach-Object { $obj.psobject.Properties.Value -join ', ' }

Volkswagen, Passat

Write-Output 命令只是在代码中为Select-String 生成输入对象的实际命令的替代,例如Import-Csv


  • 您的Select-String 输出意味着[pscustomobject] 实例用作其输入,例如Import-Csv 的输出。

    • 例如,您的输出暗示了一个输入对象,例如
      [pscustomobject] @{ Brand = 'Volkswagen'; Model = 'Passat' }
  • 正如 Theo 所说,Select-String 旨在对 字符串 进行操作,而不是对 具有属性的对象

    • Select-String 收到此类对象时,它会为它们创建一个字符串 表示并搜索那个

    • 使这特别无用的是,此字符串表示与您在 终端(控制台)中看到的相同,其中使用了 PowerShell 丰富的输出格式;相反,执行简单的.ToString() 字符串化,这与[pscustomobject] 实例一起导致诸如'@{Brand=Volkswagen; Model=Passat}' 之类的表示(可能令人困惑,这类似于- 但不同于- 哈希表文字)。

      • GitHub issue #10726 建议将 Select-String 更改为对丰富的显示格式表示进行操作。
  • 此外,如果您确实Select-String 对此类对象进行操作,则其输出Microsoft.PowerShell.Commands.MatchInfo 实例)不再包含输入对象 em>,仅它们的字符串表示,这意味着为了提取值VolkswagenPassat,您必须执行字符串解析,即既麻烦又不健壮。


要根据属性值过滤具有属性的输入对象,Where-Object 是更好的选择;例如:

PS> [pscustomobject] @{ Brand = 'Volkswagen'; Model = 'Passat' }, 
    [pscustomobject] @{ Brand = 'Ford'; Model = 'Mondeo' } |
      Where-Object Brand -eq Volkswagen

Brand      Model
-----      -----
Volkswagen Passat

也就是说,使用Select-Object 仍然会有所帮助如果您不知道输入对象具有哪些属性,并且想在对象,通过它的 string 表示:

PS> [pscustomobject] @{ Brand = 'Volkswagen'; Model = 'Passat' }, 
    [pscustomobject] @{ Brand = 'Ford'; Model = 'Mondeo' } |
      Select-String -SimpleMatch wagen

@{Brand=Volkswagen; Model=Passat}

以上是您尝试过的,但如前所述,这实际上只输出整个对象的字符串表示形式,之后没有(简单)提取属性值的能力。

解决方案是在输入对象生成命令上使用common -PipelineVariable parameter,它允许在稍后管道段的 (ForEach-Object) 脚本块中访问手头的对象,这允许您轻松创建所需的以逗号分隔的属性值列表(即使不知道属性名称):

# Note the use of -PipelineVariable obj and the use of $obj later.
PS> Write-Output -PipelineVariable obj (
      [pscustomobject] @{ Brand = 'Volkswagen'; Model = 'Passat' }, 
      [pscustomobject] @{ Brand = 'Ford'; Model = 'Mondeo' }
    ) |
      Select-String -SimpleMatch wagen |
        ForEach-Object { $obj.psobject.Properties.Value -join ', ' }

Volkswagen, Passat

$obj.psobject.Properties.Value 使用 PowerShell 为所有对象提供的隐藏的、内在的 .psobject 属性,这是 反射 的丰富来源,在这种情况下,可以通过 @ 轻松访问所有属性值987654330@.

【讨论】:

    【解决方案2】:

    不要在 PsObjects 集合上执行 select-string,因为该 cmdlet 设计用于在 字符串文件 中查找文本..
    Select-Object -ExpandProperty让您扩展一个属性,而不是全部。 如果您想要这样的输出,请遍历数组中的对象并按照您希望的方式将属性组合成一个字符串。

    假设你的数组是这样的:

    $theCarCollection = [PsCustomObject]@{Brand='Volkswagen'; Model='Passat'},
                        [PsCustomObject]@{Brand='Ford'; Model='Mondeo'}
    

    然后通过循环遍历对象并选择所需的属性来格式化输出

    ($theCarCollection | ForEach-Object { '{0}, {1}' -f $_.Brand, $_.Model }) -join [environment]::NewLine
    

    将输出:

    Volkswagen, Passat
    Ford, Mondeo
    

    【讨论】:

    • 谢谢,但我在两个不同的文件中有数百条记录,我正在对它们进行匹配,因此数组将无法工作,因为我无法更改输入文件跨度>
    • @kkp0897 然后解释一下这些文件是什么......也许是CSV?
    【解决方案3】:

    可能是这样的:

    Select-String -Path "C:\temp\test.txt" -Pattern "test" | select line -ExpandProperty line
    

    【讨论】:

    • 谢谢,但没有,它只是再次返回以下@{Brand=Volkswagen;型号=帕萨特}@{品牌=福特;型号=蒙迪欧}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2012-09-09
    • 2018-06-13
    相关资源
    最近更新 更多