2015-12-13 58 views
1

我拉着從SCOM服務器列表,並要檢查這個名單對其中包含以下數據的CSV:如果發現服務器查找值從第2列

Computername,Collection Name 
Server01,NA - All DA Servers - Patching - Cert - Thu 2:00 
Server02,NA - All DA Servers - Patching - Prod - Wed 18:00 

,返回集合名稱。我只是不確定什麼是最好的方法。

Import-Module OperationsManager 

New-SCOMManagementGroupConnection -ComputerName SCOMsvr 

$PendReboot = Get-ScomAlert -Criteria "Severity = 1 AND ResolutionState < 254 AND Name = 'Pending Reboot'" | 
       Select NetbiosComputerName 

$data = Import-Csv .\servers2.csv 

$table = $data | Group-Object -AsHashTable -AsString -Property Computername 

編輯 - 第二次嘗試代碼:

$csv = Import-Csv D:\SCOM-Pend-Reboot.csv 

$biglist = Import-Csv D:\servers2.csv 

foreach ($line in $csv){ 
    $server = $line.NetbiosComputerName 

    if ($server -eq $biglist.Computername) { 
    "$server is in $biglist.'Collection Name'" 
    } else { 
    "$server is not found!" 
    } 
} 

回答

1

如果組CSV數據一樣,你必須訪問信息像這樣,因爲該組項目的值也包含Servername屬性:

$server = 'Server01' 
$table[$server].'Collection Name' 

這隻有在您的CSV有多列時纔有意義。但即使如此,我可能會更喜歡自定義對象的hastable使服務器的名稱出現於密鑰:

$table = @{} 
Import-Csv .\servers2.csv | ForEach-Object { 
    $table[$_.Computername] = New-Object -Type PSCustomObject -Property @{ 
    'Collection Name' = $_.'Collection Name' 
    'other property' = ... 
    ... 
    } 
} 

如果CSV剛剛兩列它會是簡單的創建這樣的哈希表:

$table = @{} 
Import-Csv .\servers2.csv | ForEach-Object { 
    $table[$_.Computername] = $_.'Collection Name' 
} 

所以,你可以查找直接名稱:

$server = 'Server01' 
$table[$server] 
+0

我真的很感謝回覆!運行這個返回'索引操作失敗;數組索引在'$ table [$ _。Computername] = $ _。'Collection Name'處評估爲null'' – user4317867

+1

@ user4317867您的CSV中有一個空行。去掉它。 –

+0

@ user4317867我發佈的代碼導入CSV並用數據填充散列表'$ table'。在此過程中沒有生成控制檯輸出。 –

0

你可以這樣做:

Import-Module OperationsManager 

New-SCOMManagementGroupConnection -ComputerName SCOMsvr 

$PendReboot = get-scomalert -Criteria "Severity = 1 AND ResolutionState < 254 AND Name = 'Pending Reboot'" | Select NetbiosComputerName 

$data = Import-Csv .\servers2.csv 

$table = $data | Group-Object -AsHashTable -AsString -Property Computername 

foreach($server in $PendReboot) { 
    if($table.ContainsKey($server)) { 
     ($table.$server)."Collection Name" 
    } 
} 
+0

只是嘗試這樣做,但沒有得到輸出。所以我試着將'Get-SCOMAlert'管道設置爲'Export-CSV',然後'$ PendReboot = Import-CSV ...',但仍然沒有輸出。在控制檯中運行foreach返回'@ {NetbiosComputerName = Server101}' – user4317867

0

的過度複雜的事情的情況。

Thanks to this post我的回答很簡單:

IF(-not(Get-SCOMAlert)){Import-Module OperationsManager} 

New-SCOMManagementGroupConnection -ComputerName SCOM-Server 

Get-SCOMAlert -Criteria "Severity = 1 AND ResolutionState < 254 AND Name = 'Pending'" | Select NetbiosComputerName | Export-Csv -NoTypeInformation -Path D:\SCOM-Pend-Reboot.csv 

$csv = Get-Content 'D:\SCOM-Pend-Reboot.csv' 
Import-Csv D:\servers2.csv | Where {$_ -match $csv.computername} | Sort Computername