Поиск нескольких текстовых файлов для строки и скопировать строку, добавив его в summary_ [date] .log - PullRequest
1 голос
/ 09 марта 2020

Я пытаюсь найти несколько журналов с разными именами файлов. Я хочу найти имя хоста в каждом журнале, и когда совпадение будет найдено, скопируйте всю эту строку в summary_ [date] .log и продолжайте добавлять к нему совпадающие строки. Итак, я начал с:

$captured = Get-ChildItem -recurse -Path \\nas1\share1 -Include *.log |
where { ($_.Name | Select-String -pattern ('PC1','PC2','PC3') -SimpleMatch) } 
Now copy the line from each log file which contains the pattern and append it to a file with today's date stamp, so each week I'll have a file like \\nas1\share1\summary_03-07-2020.log

Но это не совсем то, что я хочу, так как это захватывает имена файлов и добавляет их в переменную $ captured. Также отсутствует код для копирования любых совпадающих строк в метку даты summary_ [date] .log

Каждый текстовый файл будет содержать среди других строк, начинающихся с метки времени, что-то вроде этого:

03-07-2020_14-36-17 - Резервная копия компьютера [PC1] успешно создана.

Итак, я хочу найти несколько текстовых файлов в общей папке по нескольким именам хостов. , Если текстовый файл содержит имя хоста, добавьте строку с именем хоста к summary_ [date] .log. И наконец, поскольку все совпадающие строки начинаются с отметки даты / времени, мне нужно сохранить содержимое файла summary_ [date] .log, отсортированного от самой новой даты к самой старой.

По сути, я должен получить итоговую_ [date] .log каждую неделю, которая будет выглядеть примерно так:

03-07-2020_14-36-17 - Backup of computer [PC1] is successfully created.
03-07-2020_13-21-12 - Backup of computer [PC3] is successfully created.
03-07-2020_11-36-29 - Backup of computer [PC2] is successfully created.

Делая это, я получаю сводку всех файлов журнала за этот день в одном файле, который затем автоматически отправляю по электронной почте указанным c адрес электронной почты.

Как мне выполнить sh это?

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

Насколько велики ваши файлы журналов?

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

Если имеется большое количество файлов или больших файлов, вы можете сделать несколько вложенных циклов foreach и l oop через каждое имя компьютера для каждого файла.

При этом также используется сопоставление, а не как в where-object, ты можешь использовать. например, если вы получаете ложные срабатывания.

$FileContent = Get-Content -Path "\\nas1\share1\*.log"
$ComputerArray = 'PC1','PC2','PC3'
$DateStamp =  get-date -Format dd-MM-yyyy
$OutFile = 'summary_' + $DateStamp + '.log'

foreach ($ComputerName in $ComputerArray)
{
    $FileContent | Where {$_ -match $ComputerName} | Add-Content -Path $OutFile
} 
0 голосов
/ 09 марта 2020

Ваш текущий код выбирает строку из имени файла, а не содержимого. Чтобы сделать то, что вы хотите, вы можете использовать что-то вроде этого:

$logFolder = '\\nas1\share1'
$outFile   = Join-Path -Path $logFolder -ChildPath ('summary_{0:dd-MM-yyyy}.log' -f (Get-Date))
$captured  = Get-ChildItem -Recurse -Path $logFolder -Include *.log | ForEach-Object {
    ($_ | Select-String -Pattern 'PC1','PC2','PC3' -SimpleMatch).Line
} | Sort-Object  # sorting is optional of course

#output on screen
$captured

# output to new log file
$captured | Set-Content -Path $outFile

Далее отправьте этот файл в виде вложения как:

# use splatting for cmdlets that take a lot of parameters
$params = @{ 
    SmtpServer  = 'yourmailserver'
    From        = 'logtester@yourcompany.com'
    To          = 'someone@yourcompany.com'
    Subject     = 'Summary'
    Body        = 'Hi, in the attachment a summary of the backup logs'
    Attachments = $outFile
    # etc. 
} 

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