我有一组对象。
我想加入这些对象的属性,通常我会这样做:
$Objs.prop1 -join(',')
$Objs.prop2 -join(',')
$Objs.prop3 -join(',')
但是对于这种情况,我想在加入之前对属性进行一些操作,这意味着我必须(希望有一种更强大的方式)这样做:
$ArrObj = @()
foreach ($obj in $objs) {
$calcProp1 = [math]::Round($obj.prop1 / 1MB)
$calcProp2 = [math]::Round($obj.prop2 / 1MB)
$calcProp3 = [math]::Round($obj.prop3 / 1MB)
$ArrObj += [string]$clacProp1+','+$clacProp2+','+$clacProp3}
}
有没有一个漂亮的PS快捷方式来做这样的事情?
答案 0 :(得分:3)
您的两个代码段做了不同的事情。假设您不希望想要在所有对象中加入与第一个示例中相同的属性,而是像第二个示例中那样连接每个对象的属性,这应该可以执行您想要的操作:
$objs | ForEach-Object {
($_.PSObject.Properties | ForEach-Object {
[math]::Round($_.Value / 1MB)
}) -join ','
}
如果您只想要选择的属性,可以按名称过滤它们:
$propertyNames = 'prop1', 'prop2', 'prop3'
$objs | ForEach-Object {
($_.PSObject.Properties | Where-Object {
$propertyNames -contains $_.Name
} | ForEach-Object {
[math]::Round($_.Value / 1MB)
}) -join ','
}
或使用自定义函数在加入之前操作值:
function Convert-PropertyValue {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true)]
[Management.Automation.PSPropertyInfo]$Property
)
Process {
switch ($Property.Name) {
'prop1' { [math]::Round($Property.Value / 1MB) }
'prop2' { $Property.Value + 42 }
'prop3' { 'Value: {0:d3}' -f $Property.Value }
default { $Property.Value }
}
}
}
$objs | ForEach-Object {
($_.PSObject.Properties | Convert-PropertyValue) -join ','
}
答案 1 :(得分:0)
首先,在属性之间使用逗号格式化对象的一种非常直接的方法是使用PSv3提供的ConvertTo-Csv
cmdlet:
$Objs | Select prop1,prop2,prop3 | ConvertTo-Csv -NoTypeInformation
接下来,如果要转换属性,可以将Select-Object
与表达式一起使用:
$Objs | Select-Object -Property `
@{Label="Calc1";Value={[math]::Round($_.prop1 / 1MB)}} `
@{Label="Calc2";Value={[math]::Round($_.prop2 / 1MB)}} `
@{Label="Calc3";Value={[math]::Round($_.prop3 / 1MB)}} `
| ConvertTo-Csv -NoTypeInformation
使用Add-Member
cmdlet可以扩展原始对象。您可以添加新的计算属性:
$Objs | Add-Member -MemberType ScriptProperty -Name "Calc1" -Value {[math]::Round($_.prop1 / 1MB)}}
$Objs | Add-Member -MemberType ScriptProperty -Name "Calc2" -Value {[math]::Round($_.prop2 / 1MB)}}
$Objs | Add-Member -MemberType ScriptProperty -Name "Calc3" -Value {[math]::Round($_.prop3 / 1MB)}}
这将在$ Objs上为您提供三个名为Calc1 | 2 | 3的附加属性,然后您可以将其转换为CSV格式:
$Objs | Select Calc1,Calc2,Calc3 | ConvertTo-Csv -NoTypeInformation