Зацикливание и подстрока Powershell - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь очистить сотни журналов DNS для анализа.Я нашел код Powershell в онлайн-исследовании, которое я использую.Однако код обрабатывает только один файл за раз.Я хотел бы повторить код для нескольких файлов, расположенных в одной папке.Кроме того, я хочу подстроку имени файла каждого журнала DNS, чтобы получить имя сервера (первые 10 символов имени файла).

Я использовал Get-ChildItem для перебора нескольких файлов, и я считаю, что это успешно.Однако я застрял на том, как получить имя сервера из файла и поместить его в столбец.

function Get-DNSDebugLog
{

    [CmdletBinding()]
    param(
      [Parameter(Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
      [Alias('Fullname')]
      [string] $DNSLog = 'StringMode')


    BEGIN { }

    PROCESS {

        $TheReverseRegExString='\(\d\)in-addr\(\d\)arpa\(\d\)'

        ReturnDNSLogLines -DNSLog $DNSLog | % {
                if ( $_ -match '^\d\d|^\d/\d' -AND $_ -notlike '*EVENT*' -AND $_ -notlike '* Note: *') {
                    $Date=$null
                    $Time=$null
                    $DateTime=$null
                    $Protocol=$null
                    $Client=$null
                    $SendReceive=$null
                    $QueryType=$null
                    $RecordType=$null
                    $Query=$null
                    $Result=$null

                    $Date=($_ -split ' ')[0]
                    $ServerName = $null
                    # Check log time format and set properties
                    if ($_ -match ':\d\d AM|:\d\d  PM') {
                        $Time=($_ -split ' ')[1,2] -join ' '
                        $Protocol=($_ -split ' ')[7]
                        $Client=($_ -split ' ')[9]
                        $SendReceive=($_ -split ' ')[8]
                        $RecordType=(($_ -split ']')[1] -split ' ')[1]
                        $Query=($_.ToString().Substring(110)) -replace '\s' -replace '\(\d?\d\)','.' -replace '^\.' -replace "\.$"
                        $Result=(((($_ -split '\[')[1]).ToString().Substring(9)) -split ']')[0] -replace ' '
                        $ServerName=@{N='First5Chars';E={$_.BaseName.SubString(0,5)}}
                    }
                    elseif ($_ -match '^\d\d\d\d\d\d\d\d \d\d:') {
                        $Date=$Date.Substring(0,4) + '-' + $Date.Substring(4,2) + '-' + $Date.Substring(6,2)
                        $Time=($_ -split ' ')[1] -join ' '
                        $Protocol=($_ -split ' ')[6]
                        $Client=($_ -split ' ')[8]
                        $SendReceive=($_ -split ' ')[7]
                        $RecordType=(($_ -split ']')[1] -split ' ')[1]
                        $Query=($_.ToString().Substring(110)) -replace '\s' -replace '\(\d?\d\)','.' -replace '^\.' -replace "\.$"
                        $Result=(((($_ -split '\[')[1]).ToString().Substring(9)) -split ']')[0] -replace ' '
                        $ServerName=@{N='First5Chars';E={$_.BaseName.SubString(0,5)}}
                    }
                    else {
                        $Time=($_ -split ' ')[1]
                        $Protocol=($_ -split ' ')[6]
                        $Client=($_ -split ' ')[8]
                        $SendReceive=($_ -split ' ')[7]
                        $RecordType=(($_ -split ']')[1] -split ' ')[1]
                        $Query=($_.ToString().Substring(110)) -replace '\s' -replace '\(\d?\d\)','.' -replace '^\.' -replace "\.$"
                        $Result=(((($_ -split '\[')[1]).ToString().Substring(9)) -split ']')[0] -replace ' '
                        $ServerName=@{N='First5Chars';E={$_.BaseName.SubString(0,5)}}
                    }

                    $DateTime=Get-Date("$Date $Time") -Format 'yyyy-MM-dd HH:mm:ss'


                    if ($_ -match $TheReverseRegExString) {
                        $QueryType='Reverse'
                    }
                    else {
                        $QueryType='Forward'
                    }

                    $returnObj = New-Object System.Object
                    $returnObj | Add-Member -Type NoteProperty -Name Date -Value $DateTime
                    $returnObj | Add-Member -Type NoteProperty -Name QueryType -Value $QueryType
                    $returnObj | Add-Member -Type NoteProperty -Name Client -Value $Client
                    $returnObj | Add-Member -Type NoteProperty -Name SendReceive -Value $SendReceive
                    $returnObj | Add-Member -Type NoteProperty -Name Protocol -Value $Protocol
                    $returnObj | Add-Member -Type NoteProperty -Name RecordType -Value $RecordType
                    $returnObj | Add-Member -Type NoteProperty -Name Query -Value $Query
                    $returnObj | Add-Member -Type NoteProperty -Name Results -Value $Result

                    if ($returnObj.Query -ne $null) {
                        Write-Output $returnObj
                    }
                }
            }

    }

    END { }
}



function ReturnDNSLogLines
{
param(
$DNSLog)

$PathCorrect=try { Test-Path $DNSLog -ErrorAction Stop } catch { $false }

    if ($DNSLog -match '^\d\d|^\d/\d' -AND $DNSLog -notlike '*EVENT*' -AND $PathCorrect -ne $true) {
        $DNSLog
    }
    elseif ($PathCorrect -eq $true) {
        Get-Content $DNSLog | % { $_ }
    }
}

$DNSlogs = Get-ChildItem "C:/users/Desktop/*.log" |
foreach ($d in $DNSlogs):{
    $Servername = $DNSlogs[0]}


Get-DNSDebugLog -DNSLog "C:/users/Desktop/*.log" | Export-Csv .\ProperlyFormatedLog2.csv.

1 Ответ

0 голосов
/ 06 июня 2019

Это не лучший подход, но он должен работать без изменения кода функции.

$DNSlogs = Get-ChildItem "C:/users/Desktop/*.log"
foreach ($d in $DNSlogs) {
    $Servername = $d.basename.substring(0,[math]::Min(10,$d.basename.length))
    Get-DNSDebugLog -DNSLog $d.FullName | Select *,@{n='ServerName';e={$ServerName}} | Export-Csv -Path '.\ProperlyFormatedLog2.csv' -NoTypeInformation -Append
}

Я знаю, что вы сказали, что вы хотели первые 10 символов имени файла для имени сервера. Я добавил функцию [Math]::Min(), чтобы захватить все символы, если их длина меньше 10, на случай, если у вас короткое имя сервера. Свойство .basename объекта file содержит имя файла, исключая расширение.

Мне кажется, что для выполнения ВСЕ, что вы хотите, может потребоваться перезапись, включая параллельную обработку при получении имени сервера. Я также вижу, что ваша функция устанавливает $ServerName, но вы никогда не используете его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...