Powershell 当输出包含@{<;value1=xxx>;,<;value1=yyy>;}时,如何展开多个属性?

Powershell 当输出包含@{<;value1=xxx>;,<;value1=yyy>;}时,如何展开多个属性?,powershell,output,select-string,select-object,Powershell,Output,Select String,Select Object,我知道有很多关于扩展单个属性的帖子,希望这是一个简单的帖子,但是我的输出看起来像是一个selectstring-simplematch的结果 @{品牌=大众;型号=帕萨特} @{品牌=福特;型号=蒙迪欧} 但是我如何扩展这两个属性并使输出看起来像这样呢 大众、帕萨特 福特,蒙迪欧 当我选择一个对象时,我会得到下面的结果,但我似乎不能只得到值 IgnoreCase:正确 行号:1 行:@{Brand=Volkswagen;Model=Passat} 文件名:InputStream 路径:Input

我知道有很多关于扩展单个属性的帖子,希望这是一个简单的帖子,但是我的输出看起来像是一个selectstring-simplematch的结果

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

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

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

当我选择一个对象时,我会得到下面的结果,但我似乎不能只得到值

IgnoreCase:正确
行号:1
行:@{Brand=Volkswagen;Model=Passat}
文件名:InputStream
路径:InputStream
图案:@{Brand=Volkwagen;Model=Passat}
上下文:
匹配:{}

IgnoreCase:正确
行号:2
行:@{Brand=Ford;Model=Mondeo}
文件名:InputStream
路径:InputStream
模式:@{Brand=Ford;Model=Mondeo}
上下文:

匹配:{}

可能是这样的:

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

不要对PSObject集合执行
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
补充:

tl;博士

#注意-PipelineVariable obj的用法以及后面$obj的用法。
PS>写入输出-管道变量obj(
[pscustomobject]@{品牌='Volkswagen';车型='Passat'},
[pscustomobject]@{品牌='Ford';车型='Mondeo'}
) |
选择字符串-SimpleMatch wagen|
ForEach对象{$obj.psobject.Properties.Value-join','}
大众,帕萨特
该命令只是实际命令的替代,该命令为代码中的
Select String
生成输入对象,例如
Import Csv


  • 您的输出意味着将
    [pscustomobject]
    实例用作其输入,例如,output by

    • 例如,您的输出意味着输入对象,如
      [pscustomobject]@{Brand='Volkswagen';Model='Passat'}
  • 正如西奥所指出的,
    selectstring
    设计用于对字符串进行操作,而不是对具有属性的对象进行操作

    • Select String
      接收到这样的对象时,它会为这些对象创建一个字符串表示并搜索该对象

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

      • 建议更改
        Select String
        ,改为对富显示格式表示进行操作
  • 此外,如果让
    Select String
    对这些对象进行操作,其输出(实例)不再包含输入对象,只包含它们的字符串表示,这意味着为了提取值
    Volkswagen
    Passat
    ,必须执行字符串解析,这既麻烦又不健壮


根据属性值过滤具有属性的输入对象是更好的选择;e、 g:

PS>[pscustomobject]@{Brand='Volkswagen';Model='Passat'},
[pscustomobject]@{品牌='Ford';车型='Mondeo'}|
何处目标品牌-eq大众
品牌模式
-----      -----
大众帕萨特
也就是说,如果您不知道输入对象具有哪些属性,并且希望通过其字符串表示法在对象中的某个位置找到值,则使用
选择对象
仍然很有帮助:

PS>[pscustomobject]@{Brand='Volkswagen';Model='Passat'},
[pscustomobject]@{品牌='Ford';车型='Mondeo'}|
选择字符串-SimpleMatch wagen
@{品牌=大众;型号=帕萨特}
上面是您尝试过的,但是,如上所述,这实际上只输出整个对象的字符串表示,之后无法(轻松)提取属性值

解决方案是使用on The input object producting命令,该命令允许在稍后的管道段()脚本块中访问手头的对象,该脚本块允许您轻松创建所需的以逗号分隔的属性值列表(即使不知道属性名称):

#注意-PipelineVariable obj的用法以及后面$obj的用法。
PS>写入输出-管道变量obj(
[pscustomobject]@{品牌='Volkswagen';车型='Passat'},
[pscustomobject]@{品牌='Ford';车型='Mondeo'}
) |
选择字符串-SimpleMatch wagen|
ForEach对象{$obj.psobject.Properties.Value-join','}
大众,帕萨特

$obj.psobject.Properties.Value
使用PowerShell为所有对象提供的隐藏的、固有的
.psobject
属性,这是一个丰富的反射源,在本例中允许通过轻松访问所有属性值。

请注意,特别是
-ExpandProperty
参数。请允许我给您一个标准建议:如果您有答案,您将通过向未来的读者展示解决问题的方法来帮助他们。要接受答案,请单击大标题✓ 大nu下的符号