Файл журнала анализа - извлечение строк с несколькими целями и дальнейшие результаты анализа - PullRequest
0 голосов
/ 25 марта 2020

У меня есть вопрос, касающийся синтаксического анализа файла журнала в powershell 3.0. Помощь очень ценится

Пример файла журнала:

.Processing begin...
     -Sending file \\CL2BATCH1\CFGP\PDF\templates\T_Test_Printer_Page.pdf to test the printer...
     [05:15:06 AM] Begin printing file [\\CL2BATCH1\CFGP\PDF\templates\T_Test_Printer_Page.pdf]. Number of pages:1
     [05:15:07 AM] Print completed.

     [5:15:08 AM] Merging PDF files to master PDF file:\\SERVER1\CUSTOMERNAME\PDF\Alt_Man_Cert\P_00292300-00_700700-0000_1_AMC_20200325051507.PDF
      [5:15:08 AM] Merged file:\\SERVER1\CUSTOMERNAME\PDF\Alt_Man_Cert\MC_SCHLIST_000.PDF
      [5:15:08 AM] Merged file:\\SERVER1\CUSTOMERNAME\PDF\Alt_Man_Cert\MC_4729028.PDF
     [05:15:08 AM] Begin printing file [\\SERVER1\CUSTOMERNAME\PDF\Alt_Man_Cert\P_00292300-00_700700-0000_1_AMC_20200325051507.PDF]. Number of pages:2
     [05:15:09 AM] Print completed.
    -----------------------------
       -Number of Accounts selected for this run:1
       -Number of Account successfully printed  :1
       -Number of Account failed to be printed  :0

   ----------------------------------
   Generating In-House School Report: MCPrintReport_700700-0000_1_20200325051507.PDF
     [5:15:10 AM] Merging PDF files to master PDF file:\\SERVER1\CUSTOMERNAME\PDF\Alt_Man_Cert\MCPrintReport_700700-0000_1_20200325051507.PDF
     [05:15:10 AM] Begin printing file [\\SERVER2\CUSTOMERNAME\PDF\Alt_Man_Cert\MCPrintReport_700700-0000_1_20200325051507.PDF]. Number of pages:1
     [05:15:11 AM] Print completed.

Я хотел бы извлечь строки, содержащие следующие критерии:

  1. ' Начните печать файла 'AND
  2. ' Alt_Man_Cert '

Мой текущий код просматривает набор файлов журнала и правильно извлекает всю строку.

$root = "c:\psscripts\mcprintcopy"
$files = Get-ChildItem -Filter MCPrint_*.log -Path $root


foreach($file in $files)
{

    if($file.LastWriteTime.ToShortDateString() -gt (get-date).AddDays(-.5))
    {

        $InStuff = Get-Content -LiteralPath $root\$file
        Write-Host 'Analyzing File: '$file
        $TargetOne = 'Begin printing file'
        $TargetTwo = @(
            'Alt_Man_Cert'
            )
        # this pipeline version otta work with ps3
        $T2_Regex = ($TargetTwo |
            ForEach-Object {
            [regex]::Escape($_)
                }) -join '|'


        $InStuff |
            Where-Object {
                $_ -match $TargetOne -and
                $_ -match $T2_Regex
                }


        $r = [regex] "\[([^\[]*)\]"
        $match = $r.match($InStuff)
        $text = $match.groups[1].value


    }
}

Проблема в том, что я на самом деле хочу только то, что находится в скобках, так как мне понадобится путь к каталогу, чтобы скопировать эти файлы в другое место назначения.

[\ CL2BATCH1 \ CFGP \ PDF \ Alt_Man_Cert \ P_00292300-00_700700-0000_1_AMC_20200325051507.PDF] и [\ CL2BATCH1 \ CFGP \ PDF \ Alt_Man_Cert \ MCPrint205015050000000000000007

1 Ответ

1 голос
/ 25 марта 2020

Объедините шаблоны и используйте группу захвата (точно так же, как ваша $r) и переменную automati c $matches для этого:

$InStuff = Get-Content -LiteralPath $root\$file

$filePaths = $InStuff |ForEach-Object {
  if($_ -match 'Begin printing file \[([^\]]*Alt_Man_Cert[^\]]*)\]'){
    $matches[1]
  }
}

$filePaths будет содержать пути к файлам (без скобок)

...