根据不同的对象属性添加新属性

时间:2015-06-19 18:27:01

标签: arrays regex parsing powershell

我正在尝试搜索表格每行中的一列。然后我想根据搜索的数字为行添加另一个值。

此代码生成表格:

$LUNSSummary = ($NY_LUNS)  -split '\s+(?=LOGICAL UNIT NUMBER)' | foreach {
    $Stringdata = $_.replace(':','=')
    New-Object PSObject -Property $(ConvertFrom-StringData $Stringdata)
}

$LUNSSummary |
    select 'Name','LOGICAL UNIT NUMBER','State','LUN Capacity(Megabytes)','LU Storage Groups' |
    Format-Table -AutoSize

enter image description here

然后我有这个代码可以使用“逻辑单元号”进行搜索并产生所需的输出。在这个例子中,-contains是上面屏幕截图中的1029。

$data = $LUNS_in_Pools | Out-String
$pools = $data -replace ': +','=' -split "`r`n`r`n" |
  % { New-Object -Type PSCustomObject -Property (ConvertFrom-StringData $_) } |
  select -Property *,@{n='LUNs';e={$_.LUNs -split ', '}} -Exclude LUNs

$pools | ? { $_.LUNs -contains 1029 } | select -Expand 'Pool Name'

在这种情况下产生“池2”。结果可以是1-99池。

enter image description here

我想将这两个代码组合起来搜索每个“逻辑单元号”,并将结果添加到第5个部分/列“Pools”中表格的末尾。

修改

根据要求,原始数据:

所需输出:(池从“逻辑单元号”获得) enter image description here

编辑2

到目前为止,这是最接近正确的,它每次打印相同的池结果。

$LUNSSummary = 
($NY_LUNS)  -split '\s+(?=LOGICAL UNIT NUMBER)' | 
foreach { $Stringdata = 
          $_.replace(':','=')
          New-Object PSObject -Property  $(ConvertFrom-StringData $Stringdata)
} 

$data = $LUNS_in_Pools | Out-String
$pools = $data -replace ': +','=' -split "`r`n`r`n" |
  % { New-Object -Type PSCustomObject -Property (ConvertFrom-StringData $_) } |
  select -Property *,@{n='LUNs';e={$_.LUNs -split ', '}} -Exclude LUNs

$poolProperty = @{Label="Pool";Expression={$pools | ? { $_.LUNs -contains       [int]$_.'LOGICAL UNIT NUMBER'} | select -Expand 'Pool Name'}}
$LUNSSummary | select 'Name','LOGICAL UNIT NUMBER','State','LUN      Capacity(Megabytes)','LU Storage Groups',$poolProperty

如果我检查$pools | ? { $_.LUNs -contains [int]$_.'LOGICAL UNIT NUMBER'} | select -Expand 'Pool Name'

的输出

我只看到一个结果。我想也许它必须循环一些如何?

1 个答案:

答案 0 :(得分:3)

从猜测中你只需要在“游泳池”的末端再增加一个计算属性。您已经拥有并测试了逻辑。只需要实现它。

$poolProperty = @{Label="Pool";Expression={
    $lunID = $_.'LOGICAL UNIT NUMBER';
    $pools | Where-Object{$_.LUNs -contains $lunID} | 
        Select-Object -Expand 'Pool Name'}
}
$LUNSSummary | select 'Name','LOGICAL UNIT NUMBER','State','LUN Capacity(Megabytes)','LU Storage Groups',$poolProperty

我们获取管道中当前项目的LOGICAL UNIT NUMBER并保存它,以便我们可以启动另一个来从$pools对象中提取匹配项。只要您luns是独占的,这将始终返回一个Pool Name

以上内容应该有效,但我更改了$pools的创建方式,因此它符合$LUNSSummary的逻辑。我在这里使用了字符串来表示来自粘贴箱的原始数据。

$LUNSSummary = ($NY_LUNS)  -split '\s+(?=LOGICAL UNIT NUMBER)' | 
foreach { $Stringdata = 
          $_.replace(':','=')
          New-Object PSObject -Property  $(ConvertFrom-StringData $Stringdata)
} 

$pools = ($LUNS_in_Pools | Out-String) -split '\s+(?=Pool Name)' | ForEach-Object{
    New-Object -Type PSCustomObject -Property (ConvertFrom-StringData ($_ -replace ":","=")) |
    Select -Property *,@{n='LUNs';e={$_.LUNs -split ',\s*'}} -Exclude LUNs
}

$poolProperty = @{Label="Pool";Expression={
    $lunID = $_.'LOGICAL UNIT NUMBER';
    $pools | Where-Object{$_.LUNs -contains $lunID} | 
        Select-Object -Expand 'Pool Name'}
}
$LUNSSummary | select 'Name','LOGICAL UNIT NUMBER','State','LUN Capacity(Megabytes)','LU Storage Groups',$poolProperty

看起来$LUNS_in_Pools是换行符分隔的字符串。管道到Out-String已将其清除以删除换行符并允许regex / ConvertFrom-StringData生效。