我有一个用于检测 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
}
}
uj5u.com热心网友回复:
你可能正在寻找这样的东西:
[pscustomobject] @{
'Computer Name' = $hostname
'Affected Location' = $List -join "`r`n"
} | Export-CSV $file_location -noTypeInformation -Force -Append -Encoding UTF8
请注意,由于在列中使用换行符 ( ) 作为分隔符,因此在每次迭代中创建的每个 CSV 行(可能)将跨越多行。"`r`n"
Affected Location
至于你尝试了什么:
您的哈希表文字(例如
@{N="Computer Name";E={$hostname}}
)使用计算属性的语法,但您没有使用 cmdlet - 通常Select-Object
- 能够创建计算属性。更一般地,
Export-Csv
并ConvertTo-Csv
在Windows PowerShell中也没有有意义的支持哈希表作为输入物件-你需要提供[pscustomobject]
由铸造改为实体,您可以轻松地创建[1]到Hashtable的文字[pscustomobject]
,如上图所示,- 相比之下,在PowerShell (Core) 7 中,您现在可以直接使用哈希表作为输入,尽管您可能希望使用
[ordered]
哈希表进行可预测的列排序。
- 相比之下,在PowerShell (Core) 7 中,您现在可以直接使用哈希表作为输入,尽管您可能希望使用
[1] 严格来说,表单[pscustomobject] @{ ... }
不是cast,而是用于将实体创建为文字的内置语法糖[pscustomobject]
。事实证明,在这种情况下,哈希表文字中的键定义顺序得到维护,而它不是在独立的哈希表文字中。
0 评论