使用 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,而在独立的哈希表文字中则不是这样。
我有一个用于检测 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 - typicallySelect-Object
的语法 - 能够创建计算属性。更一般地说,
Export-Csv
andConvertTo-Csv
in Windows PowerShell do not meaningfully support hashtables 作为输入对象 - 您需要提供[pscustomobject]
个实例,您可以通过转换 [1 ][pscustomobject]
的哈希表文字,如上所示- 相比之下,在 PowerShell (Core) 7+ 中,您现在可以直接使用哈希表作为输入,尽管您可能希望使用
[ordered]
哈希表来实现可预测的列排序。
- 相比之下,在 PowerShell (Core) 7+ 中,您现在可以直接使用哈希表作为输入,尽管您可能希望使用
[1] 严格来说,形式 [pscustomobject] @{ ... }
不是 cast,而是 内置语法糖 用于创建 [pscustomobject]
个实例作为文字。在这种情况下,哈希表文字中的键定义顺序是 maintained,而在独立的哈希表文字中则不是这样。