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

标签 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'

在本例中生成“Pool 2”。结果可以是 Pool 1-99。

enter image description here

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

编辑

根据要求,原始数据:

期望的输出:(池是从“逻辑单元号”获得的) 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'} |选择-展开“池名称”

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

最佳答案

根据猜测,您只需要在“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 工作。

关于arrays - 根据不同的对象属性添加新属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30944934/

相关文章:

Java字符串标记化: Split on pattern and retain pattern

正则表达式将第一组与特定文本匹配

javascript - 如何通过 Javascript 自动添加双引号将字符串括起来?

c++ - 使用 strtok() 解析文本文件

c - 使用 "array name"和 "address-of array name"打印数组的地址

arrays - 如何使用Kotlin检查字符串数组是否按字母顺序排序?

python - 向内置函数添加方法

c++ - 指针内存分配

java - 如何将一个字符串变成一个字符串数组?

parsing - 使用 lalrpop 解析 rust 中由 "引用的字符串