2016-03-14 41 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'參數。 –

相關問題