2016-03-14 47 views
0

我有一个对象数组。加入一个对象数组的属性powershell的方式

我想加入这些对象的属性,通常我会简单地做到这一点:

$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

是'PROP1 ','prop2'和'prop3'全部数组? –

+0

从这个角度看,似乎示例(1)会在$ Objs中创建单独的以逗号分隔的数组_per _,并且示例(2)在$ Objs中创建逗号分隔的数组_per_。换句话说,一个来自$ Objs和一个连接的数据列。 –

回答

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 ',' 
} 
0

首先,一个很直接的方式来获得属性之间用逗号格式化的对象是使用ConvertTo-Csv cmdlet的,可从PSv3:

$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)}} 

这会给你三个附加属性上$ OBJ文件名为CALC1 | 2 | 3,然后你就可以转换为CSV格式:

$Objs | Select Calc1,Calc2,Calc3 | ConvertTo-Csv -NoTypeInformation 
+0

我注意到OP被标记为[powershell-v2.0]以及[powershell-v3.0],所以它可能是ConverTo-Csv非常遥不可及。 :-(希望这在任何情况下都很有趣/有用 –

+0

'ConvertTo-Csv'在v2和v3中均可用。实际上,如果您想在v2中追加CSV('ConvertTo- Csv | Out-File -Append'),因为'Export-Csv'在v3之前没有'-Append'参数。 –

相关问题