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

此代码生成表:

$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'

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

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

编辑

根据要求,原始数据:

$NY_LUNS收到它之前
  • $LUNSSummary:http://pastebin.com/5wrd51Lf
  • $LUNS_in_Pools原始数据:http://pastebin.com/Zg9q6jhe

  • 所需的输出:(从“逻辑单元号”获得池)

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

    我只看到一个结果。我在想也许必须将其循环一些?

    最佳答案

    通过猜测,您只需要为“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的逻辑匹配。我使用了这里的字符串作为粘贴箱中的原始数据。
    $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工作。

    10-04 16:48