Powershell 当输出包含@{<;value1=xxx>;,<;value1=yyy>;}时,如何展开多个属性?
我知道有很多关于扩展单个属性的帖子,希望这是一个简单的帖子,但是我的输出看起来像是一个selectstring-simplematch的结果 @{品牌=大众;型号=帕萨特}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
@{品牌=福特;型号=蒙迪欧} 但是我如何扩展这两个属性并使输出看起来像这样呢 大众、帕萨特
福特,蒙迪欧 当我选择一个对象时,我会得到下面的结果,但我似乎不能只得到值 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
- 您的输出意味着将
实例用作其输入,例如,output by[pscustomobject]
- 例如,您的输出意味着输入对象,如
[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下的符号