使用powershell方法

时间:2016-03-14 21:36:53

标签: powershell powershell-v2.0 powershell-v3.0

我有一组对象。

我想加入这些对象的属性,通常我会这样做:

$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快捷方式来做这样的事情?

2 个答案:

答案 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
相关问题