操作HBSS模块的CSV格式

时间:2017-11-08 18:38:12

标签: powershell csv security

我需要帮助处理导出为CSV的数据。现在我实际上学会了如何将列合并在一起,这样一旦将它放入CSV,主机名只显示在1行,而另外两列我合并在一起,这样每行只有一个主机名。然而,我需要更进一步。

以下是我的进展:

阶段1:

这只是好事,因为脚本检索了数据,但正如您在下面看到的那样Hostname1显示每个标题和版本的每一行,这将导致多个行的机器名重复几次CSV文件比它必须的时间长得多。

脚本:

GWMI -Class Win32_Product -Comp (GC D:\McAfeeHost.txt) |
    Where {$_.Vendor -like "mcafee*" -or $_.Vendor -like "usaf*"} |
    Select PSComputerName, Caption, Version |
    Export-Csv -NoTypeInformation d:\Get-HBSSModules-Test.csv

以CSV格式输出:

PSComputerName  caption                             version
Hostname1      McAfee Host Intrusion Prevention     8.00.0801
Hostname1      McAfee Policy Auditor Agent          6.2.0
Hostname1      McAfee DLP Endpoint                  10.0.260.42
Hostname1      McAfee VirusScan Enterprise          8.8.08000
Hostname1      ACCM                                 3.0.4.1
Hostname1      McAfee Agent                         5.00.4006

阶段2:

通过将标题和版本合并在一起,我已经取得了进展,因此从-Comp (GC D:\McAfeeHost.txt)获取的每个主机名每行只显示一次。虽然这更像是我想要的,但它不是格式化的最佳选择,如CSV输出中所示。

脚本:

GWMI -Class Win32_Product -Comp (GC D:\McAfeeHost.txt) |
    Where {$_.Vendor -like "mcafee*" -or $_.Vendor -like "usaf*"} |
    Select PSComputername, Caption, Version |
    Sort-Object Caption |
    Export-Csv -NoTypeInformation d:\Get-HBSSModules-Test.csv

$a = Import-Csv d:\Get-HBSSModules-Test.csv
$a | Group-Object PSComputerName |
    Select-Object @{name="PSComputerName";expression={$_.Name}},
        @{name="caption, version";expression={($_.Group | % { $_.Caption, $_.Version }) -join ';'}} |
    Export-Csv d:\Get-HBSSModules-Test.csv -NoTypeInformation

输出到CSV:

Phase 2 Output

阶段3:

如果可能的话,我想把每个标题连同它的版本一起放在第2阶段,但是按列分隔,每行只有一个主机名,如下所示:

Phase 3 Output

2 个答案:

答案 0 :(得分:0)

我没有多台计算机,也没有安装任何McAffee产品。但是,这是您的问题的可能解决方案。您必须将Vendor调整为PSComputerName-match RegEx,并将-ComputerName-CimSession参数添加到Get-CimInstance。但基本概念应该有效。

$Product = Get-CimInstance -ClassName Win32_Product | Where-Object {$_.Vendor -match '(microsoft|intel)'}
$Group = $Product | Group-Object -Property Vendor
$result = foreach ($Vendor in $Group) {
    $Products = foreach ($item in $Vendor.Group) {
        "$($item.Caption);$($item.Version)"
    }
    $Products = $Products -join ','
    "$($Vendor.Name),$Products"
}

$HeaderLength = ($result | ForEach-Object {($_ -split ',').Count} | Sort-Object -Descending)[0]-1
$Header = "Vendor,"
$x = 1
$Header += do {
    $x++
    "Caption;Version,"
} until ($x -eq $HeaderLength)

$Header | Out-File -FilePath $env:TEMP\strange.csv
$result | Out-File -FilePath $env:TEMP\strange.csv -Append

如果您在Excel中打开$env:TEMP\strange.csv并使用Text to columns函数并以,作为分隔符,则会在Phase 3 Output中获得请求的结果。

它并不美丽,对我来说也没有任何意义,但这就是你要求的。 :P

答案 1 :(得分:0)

使用Group-ObjectFlatten-Object

假设:

$CSV = ConvertFrom-CSV @"
PSComputerName,caption,version
Hostname1,McAfee Host Intrusion Prevention,8.00.0801
Hostname1,McAfee Policy Auditor Agent,6.2.0
Hostname1,McAfee DLP Endpoint,10.0.260.42
Hostname1,McAfee VirusScan Enterprise,8.8.08000
Hostname1,ACCM,3.0.4.1
Hostname1,McAfee Agent,5.00.4006
Hostname2,McAfee Agent,5.00.4006
Hostname2,McAfee DLP Endpoint,10.0.260.42
Hostname2,McAfee DLP Endpoint,10.0.260.42
Hostname3,McAfee Policy Auditor Agent,6.2.0
Hostname3,McAfee DLP Endpoint,10.0.260.42
"@

命令:

$CSV | Group PSComputerName | Flatten | Format-Table

结果:

Values.1  Count Group.1.PSComputerName Group.1.caption                  Group.1.version Group.2.PSComputerName Group.2.caption
--------  ----- ---------------------- ---------------                  --------------- ---------------------- ---------------
Hostname1     6 Hostname1              McAfee Host Intrusion Prevention 8.00.0801       Hostname1              McAfee Policy A...
Hostname2     3 Hostname2              McAfee Agent                     5.00.4006       Hostname2              McAfee DLP Endp...
Hostname3     2 Hostname3              McAfee Policy Auditor Agent      6.2.0           Hostname3              McAfee DLP Endp...