我需要帮助处理导出为CSV的数据。现在我实际上学会了如何将列合并在一起,这样一旦将它放入CSV,主机名只显示在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
通过将标题和版本合并在一起,我已经取得了进展,因此从-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:
如果可能的话,我想把每个标题连同它的版本一起放在第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-Object和Flatten-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...