我正在尝试搜索表格每一行中的一列。然后,我想根据正在搜索的数字向该行添加另一个值。
此代码生成表:
$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
工作。