Получить строку из текстового файла с помощью powershell - PullRequest
0 голосов
/ 10 июня 2019

У меня есть несколько текстовых файлов, которые содержат выполнение заданий планировщика Windows, я пытаюсь прочитать определенное значение из этих файлов и отправить электронное письмо,

Например: File_1.txt имеет строки ниже, и если отклоненочисло больше 0000000000, тогда мы должны получить уведомление.

RECORDS READ:        0000000042
RECORDS SKIPPED:     0000000000
RECORDS PROCESSED:   0000000042
RECORDS REJECTED:    0000000001

Я пытался использовать командлеты Get-Content и Select-string для получения строки "Records Rejected: 0000000001", но не уверен, как действовать послеэто.

$Output = Get-Content "C:\Powershell\Logs\*.log" |Select -Index 22
$output

$output = Select-String  -Path 'C:\Powershell\Logs\*.log'  -Pattern 'REJECTED:'

Ответы [ 3 ]

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

Это не самый красивый код ... на самом деле это даже не тот код, которым я доволен ... но он работает, и предполагается, что он работает так, как вам понятно!

Повернись и посмотри, как ты справишься :-)

$file = "C:\temp\file.txt"

$content = Get-Content file

$rawRecordsRejected = $content | Where-Object {$_ -like "RECORDS REJECTED:*" }

Write-Host $rawRecordsRejected -ForegroundColor DarkYellow

$title = ($rawRecordsRejected -split ":")[0].Trim()
$recordsRejected = ($rawRecordsRejected -split ":")[1].Trim()

Write-Host $title -ForegroundColor Yellow
Write-Host $recordsRejected -ForegroundColor Green
0 голосов
/ 11 июня 2019

получает отклоненный счет, используя способ, которым PoSh обрабатывает -match, когда объект слева является коллекцией.Вы получаете предмет, а не логическое значение.

# fake reading in a text file as raw text
#    in real life, use Get-Content
$InStuff = @'
RECORDS READ:        0000000042
RECORDS SKIPPED:     0000000000
RECORDS PROCESSED:   0000000042
RECORDS REJECTED:    0000000001
'@ -split [System.Environment]::NewLine

$TargetLine = 'rejected'
$MaxRejectsAllowed = 0

$RejectedCount = [int]($InStuff -match $TargetLine).Split(':')[-1].Trim()
if ($RejectedCount -gt $MaxRejectsAllowed)
    {
    Write-Warning ('The Rejected_Records count [ {0} ] is above the threshold of [ {1} ].' -f $RejectedCount, $MaxRejectsAllowed)
    }

вывод ...

WARNING: The Rejected_Records count [ 1 ] is above the threshold of [ 0 ].
0 голосов
/ 10 июня 2019

Это делает много предположений о содержании ваших файлов, поэтому, если не работает, вам может потребоваться обновить ваш вопрос с более подробной информацией:

$filename = "c:\src\scratch\text\log.txt";

# read an array containing each line of text from the file
# (there's a performance issue if the file has very many lines)
$lines = Get-Content -Path $filename;

# split each line into an array of words
# (another performance issue if the file is very large)
$records = $lines | % { @(, $_.Split(" ", [StringSplitOptions]::RemoveEmptyEntries)) };

# find the line where the second word is "REJECTED:"
# (assumes there's only ever exactly one "REJECTED" line)
# (arrays are zero-based so the first index is [0], and the second index is [1])
$rejected = $records | where-object { $_[1] -eq "REJECTED:" };

# convert the third word from that line into a number
$count = [int] $rejected[2];

write-host "rejected count = $count";

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

Когда я запускаю его с файлом примера, я получаю такой вывод:

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