そのため、 Ryker Exumで定義されているマニュアル ガイドに従って、複数の Nessus スキャンをマージするプロセスを自動化しようとしています。私が抱えている課題は、ファイル内の特定のポイントまでの行を見つけて削除する必要がある部分です (特定の文字列が見つかったら)。私の目標は、これらの Nessus スキャン結果 (XML ファイル) の一部が 100MB を超える可能性があることを考慮して、これを可能な限り効率的に行うことです。したがって、私のアプローチは次のとおりでした。
- 最初と最後のファイルを識別するロジックを配置し、それに応じて処理します。
- 最初に見つけたスキャン ファイル以外のすべての最後の 33 文字を削除します。
- 各ファイルのコンテンツを取得し、各オブジェクトを一度に 1 つずつ読み取ります。一致しない場合は、行を削除して次のオブジェクトに進みます。一致する場合は、行を削除して停止します (したがって、do until)。
この時点で、ステップ 3 を機能させることに成功していません。コードは次のとおりです。
$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)
}
}
}
考えやコメントはありますか?