使用 Export-CSV 时会保存冗余结果

redundant results are saved when using Export-CSV

我有一个用于检测 Log4j 的工作脚本,但试图将所有结果导出到 CSV。

当前脚本能够导出,但给出了多行准确结果。

$hostnames = "PC1"
foreach ($hostname in $hostnames){

Write-Host "Starting..."

$List = Invoke-Command -ComputerName $hostname  {Get-ChildItem 'C:\' -Recurse -Force -Include *.jar -ea 0 | foreach {select-string "JndiLookup.class" $_} | select -exp Path}
            
if ($List -ne $null) 
{
    $List1 = [system.String]::Join("`r`n", $List)

    $file_location = "C:\Powershell\log4j-test.csv"
    
    $global:name = @{N="Computer Name";E={$hostname}}
    $global:lists = @{N="Affected Location";E={$List1}}
    
    Write-Host "Done.."

    $name, $lists | Export-CSV $file_location -noTypeInformation -Force -Append -Encoding UTF8
    
} 

}

您可能正在寻找这样的东西:

[pscustomobject] @{
  'Computer Name' = $hostname
  'Affected Location' = $List -join "`r`n"
} | Export-CSV $file_location -noTypeInformation -Force -Append -Encoding UTF8

请注意,由于使用换行符 ("`r`n") 作为 Affected Location列。


至于你试过的

  • 您的哈希表文字(例如 @{N="Computer Name";E={$hostname}})使用 calculated property, yet you're not using a cmdlet - typically Select-Object 的语法 - 能够创建计算属性。

  • 更一般地说,Export-Csv and ConvertTo-Csv in Windows PowerShell do not meaningfully support hashtables 作为输入对象 - 您需要提供 [pscustomobject] 个实例,您可以通过转换 [1 ] [pscustomobject] 的哈希表文字,如上所示

    • 相比之下,在 PowerShell (Core) 7+ 中,您现在可以直接使用哈希表作为输入,尽管您可能希望使用 [ordered] 哈希表来实现可预测的列排序。

[1] 严格来说,形式 [pscustomobject] @{ ... } 不是 cast,而是 内置语法糖 用于创建 [pscustomobject] 个实例作为文字。在这种情况下,哈希表文字中的键定义顺序是 maintained,而在独立的哈希表文字中则不是这样。