【问题标题】:Add new property based on a different objects property根据不同的对象属性添加新属性
【发布时间】:2015-06-19 18:27:01
【问题描述】:

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

此代码生成表格:

$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

然后我有这个代码,它可以使用“逻辑单元号”进行搜索并产生所需的输出。在此示例中,-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。

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

编辑

根据要求,原始数据:

期望的输出:(池是从“逻辑单元号”中获得的)

编辑 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'的输出

我只看到一个结果。我在想也许它必须以某种方式循环?

【问题讨论】:

  • 您能否在问题中以文本形式发布一些真实的原始数据,尤其是LUNS_in_Pools 中的相关数据列。重要的是所需输出的样本。
  • 赞赏。以及所需输出的样本,以便我们知道我们的目标是什么?
  • @Kev 没问题。还添加了所需的输出。
  • 听起来你只需要一个计算表达式来匹配你。你已经完成了这项工作。您只是将Logical Unit Number$pools 中的关联结果匹配?
  • 没错,然后将其添加到表格的末尾。

标签: arrays regex parsing powershell


【解决方案1】:

据推测,您只需要在最后为“Pool”添加一个计算属性。您已经拥有并测试了逻辑。只需要实现它。

$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 的逻辑相匹配。我使用 here-strings 获取粘贴箱中的原始数据。

$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 工作。

【讨论】:

  • 这正在生成一个 Pool 列,但它们都是空白的。这可能是因为 $pools 不包含“逻辑单元号”列,$NY_LUNS 包含。
  • 我相信如果 $LUNSSummary 在每个拆分中包含来自 $pools 的信息,这将起作用。不过我可能会走得很远。
  • @RichT 我很接近。现在只是重建你的环境..很快就会发布。 $pools 出了点问题。
  • 实际上这个假设似乎是错误的......测试并告诉我。我确实可以使用上面的代码。
  • 我仍然收到 Pool 的空白条目。这是 $poolProperty pastebin.com/MNF73D6L 的输出。这是您编辑的 $pools 的输出,看起来间距更大,不知道这是否重要。 pastebin.com/ZWX8bg8a.
猜你喜欢
  • 1970-01-01
  • 2015-09-04
  • 2015-09-22
  • 2021-09-10
  • 2021-10-16
  • 1970-01-01
  • 2022-06-29
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多