因此,我正在尝试按照Ryker Exum中定义的手动指南来自动化合并多个 Nessus 扫描的过程。我面临的挑战是我必须在文件中查找和删除行直到并包括某个点(一旦找到特定字符串)。我的目标是尽可能高效地执行此操作,因为其中一些 Nessus 扫描结果(XML 文件)可能超过 100MB。因此,我的方法是:
- 放置一些逻辑来识别第一个和最后一个文件,并对它们采取相应的行动。
- 删除除我遇到的第一个扫描文件之外的所有文件的最后 33 个字符。
- 获取每个文件的内容,一次一个地读取每个对象。如果没有匹配,删除该行并移动到下一个对象。如果有匹配,删除该行并停止(因此执行直到)。
在这一点上,我还没有成功完成第三步。代码如下:
$first = Get-ChildItem ".\" -Filter *.nessus | Select-Object -first 1
$last = Get-ChildItem ".\" -Filter *.nessus | Select-Object -last 1
if ($first -ne $last)
{
Get-ChildItem ".\" -Filter *.nessus | Foreach-Object {
$filepath = $_.FullName
if ($first -eq $_ -and $last -ne $_)
{
$stream = [System.IO.File]::OpenWrite($_.FullName)
$stream.SetLength($stream.Length - 33)
$stream.Close()
$stream.Dispose()
}
if ($first -ne $_ -and $last -ne $_)
{
$stream = [System.IO.File]::OpenWrite($_.FullName)
$stream.SetLength($stream.Length - 33)
$stream.Close()
$stream.Dispose()
$found = ""
do
{
Get-Content $_.FullName | Foreach-Object {
$found = $_.Contains("<Report name=")
if ($found)
{
Where-Object {$_ -match '<Report name='} | Set-Content $filepath
} else {
Where-Object {$_ -notmatch '<Report name='} | Set-Content $filepath
}
}
} until ($found)
}
if ($last -eq $_ -and $first -ne $_)
{
$found = ""
do
{
Get-Content $_.FullName | Foreach-Object {
$found = $_.Contains("<Report name=")
if ($found)
{
Where-Object {$_ -match '<Report name='} | Set-Content $filepath
} else {
Where-Object {$_ -notmatch '<Report name='} | Set-Content $filepath
}
}
} until ($found)
}
}
}
任何人的想法或评论?