【问题标题】:Lookup value in CSV and return value from 2nd column在 CSV 中查找值并从第二列返回值
【发布时间】:2015-12-13 22:04:48
【问题描述】:

我正在从 SCOM 中提取一个服务器列表,并希望对照包含以下数据的 CSV 检查该列表:

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!"
  }
}

【问题讨论】:

    标签: csv powershell


    【解决方案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]
    

    【讨论】:

    • 非常感谢您的回复!运行此返回 Index operation failed; the array index evaluated to null $table[$_.Computername] = $_.'Collection Name'
    • @user4317867 您的 CSV 文件中有一个空行。删除它。
    • @user4317867 我发布的代码导入 CSV 并用数据填充哈希表 $table。进程中没有生成控制台输出。
    • @user4317867 这听起来像是一个完全不同的问题。您的分组标准是什么?
    • @user4317867 需要聊天通常意味着您的问题在您的问题中没有得到充分解释。我建议您更新这个问题,更详细地解释您的输入以及您希望如何处理它,或者(可能更好)用您当前的代码发布一个新问题,更详细地解释您的输入以及您希望如何处理它。
    【解决方案2】:

    你可以这样做:

    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"
        }
    }
    

    【讨论】:

    • 刚刚尝试过,但没有输出。所以我尝试将Get-SCOMAlert 设为Export-CSV 然后$PendReboot = Import-CSV ... 仍然没有输出。在控制台中运行 foreach 会返回 @{NetbiosComputerName=Server101}
    【解决方案3】:

    一个过于复杂的案例。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      相关资源
      最近更新 更多