вторник, 24 февраля 2015 г.

Windows PowerShell парсинг лога

Есть лог такого вида:
Sa 21.Feb.2015 00:07 ERROR # 3: f:\user\a.user\Documents\очень\длинный\путь\или\символы \в\нечитаемой\кодировке\документ.doc ==> \\BACKUP\5\user\a.user\Documents\очень\длинный\путь\или\символы \в\нечитаемой\кодировке\документ.doc: Системе не удается найти указанный путь. 

Нужно создать по каждому пользователю файл со списком каталогов и файлов, которые им нужно переименовать или укоротить путь.

Для этого разобьём на массив с разделителем слэш \ ,укоротим до символа  ==>. Выбирать будем по кодам ошибок "ERROR # 3:"

$path = "c:\path\"
$log = Get-Content backup.log 

# очищаем от ранее созданных файлов
Remove-Item -Path ($path + '*')

for($i=0;$i -lt $log.count;$i++) {
   If(($log[$i] -match " ERROR # 3:") -Or ($log[$i] -match " ERROR # 123:")){
     $value = @()
     $tmp = $log[$i].split("\")
     If($tmp[3] -match "Documents"){
       for($ii=3;$ii -lt $tmp.count;$ii++) {                                               If($tmp[$ii] -match "==>") {
            # Вырезаем ==>
            $value += $tmp[$ii].Substring(0, ($tmp[$ii].length - 4))
            
            # Заново собираем
            $value = $value -join '\'
            
            # Вырезаем в конце слэш \
            $value = $value.Substring(0, ($value.length - 1))
            
            # Добавляем переход на новую строку
            $value += "`n"                                
            break
            }
            Else{
                $value += $tmp[$ii]                                     
                }
          }
       # создаем файл по логину пользователя $tmp[2].ToString()
       Add-Content -Path ($path + $tmp[2].ToString() + '.txt') -Value $value             }
   }
}

Комментариев нет:

Отправить комментарий