2015-06-19 153 views
3

我試圖在表格的每一行中搜索一列。然後,我想根據正在搜索的數字爲該行添加另一個值。根據不同的對象屬性添加新屬性

此代碼將產生表:

$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節/列「池」添加到表的末尾。

EDIT

按照要求,原始數據:

所需的輸出:(池是從「邏輯」獲得單元號「) enter image description here

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

輸出我只看到一個結果。我想也許它必須循環一些如何?

+0

您可以在問題中發佈一些真實的原始數據,特別是'LUNS_in_Pools'中的相關數據列。重要的是所需輸出的樣本。 – Kev

+0

@Kev剛添加。 – RichT

+0

讚賞。還有一個期望的輸出樣本,所以我們知道我們的目標是什麼? – Kev

回答

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

+0

這是產生一個池列,但它們都是空白的。這可能是因爲$ pool不包含$ NY_LUNS的「Logical Unit Number」列。 – RichT

+0

我相信,如果$ LUNSSummary包含每個拆分中$ pool的信息,那麼這將起作用。儘管如此,我仍然可以離開。 – RichT

+0

@RichT我很接近。只是現在重建你的環境..將很快發佈。 $池有問題。 – Matt