Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43

Скрипт для формирования отчётов о НЕ регламентной перезагрузке

06.03.2019, 14:50. Показов 4761. Ответов 49

Студворк — интернет-сервис помощи студентам
Приветствую.

Камрады, нужна ваша помощь в написании скрипта.

Дано:
Есть некоторое кол-во ПК, на которых крутятся PowerShell-скрипты.
У данных ПК есть регламентные перезагрузки, которые выполняются автоматически.
Периодически с ПК бывают сбои – перезагрузки ПК.
PowerShell-скрипты фиксируют все перезагрузки, а в отдельный лог-файл записывают только НЕ регламентные перезагрузки (произошедшие по причинам сбоя в работе ПК).
Далее лог-файлы с НЕ регламентными перезагрузками отправляется на головной ПК и анализируются.

Задача:
Упростить анализ поступающих логов, путём сбора информации из логов и её помещения в несколько Excel-отчётов за:
-день
-неделю
-месяц

Решение данной задачи я вижу путём создания PowerShell-скрипта, который будет анализировать логи и создавать по собранной информации несколько отчётов в Excel документы.


У каждого лог-файла, с каждого из ПК есть уникальное для данного ПК имя, вида - P133-Reboot-ReportLOG-Attention.txt
Где P133 – означает номер ПК, что и является уникальным идентификатором среди всех остальных отчётов.

Как выглядят лог-файлы с НЕ регламентными перезагрузками (пример):

#################
#############################
######################################## #########
~~~~~~~~ Новые сутки - 02-03-2019-00:23:47 ~~~~~~~~
######################################## #########
#############################
#################


#################
#############################
######################################## #########
~~~~~~~~ Новые сутки - 03-03-2019-00:23:34 ~~~~~~~~
######################################## #########
#############################
#################

03-03-2019-09:52:03 - ПК включен - НЕ регламентная перезагрузка.

03-03-2019-19:22:48 - ПК включен - НЕ регламентная перезагрузка.


#################
#############################
######################################## #########
~~~~~~~~ Новые сутки - 04-03-2019-00:23:41 ~~~~~~~~
######################################## #########
#############################
#################


#################
#############################
######################################## #########
~~~~~~~~ Новые сутки - 05-03-2019-00:23:35 ~~~~~~~~
######################################## #########
#############################
#################




Как я вижу работу данного PowerShell-скрипта.

Версия скрипта – «Сбор данных и формирование или обновление отчёта за сегодняшний + 7 прошедших дней»
Скрипт анализирует то, что находится между строчками «Новые сутки - ДАТА»
Если между строчками ничего нет, то двигается далее.

Если между строчками есть строка «ДАТА-ВРЕМЯ - ПК включен - НЕ регламентная перезагрузка.» скрипт делает следующее:
Кликните здесь для просмотра всего текста
1. Проверяет существует ли по определенному пути Excel-документ с названием, например, «Отчёт о перезагрузке».

2. Если документа нет, то скрипт его создаёт, если же документ есть, то двигается далее.

3. Скрипт проверяет существует ли в Excel-документе лист с названием, в котором указана сегодняшняя дата + проверяет есть ли в Excel-документе листы за последние 7 дней, в которых в качестве названия указаны даты этих листов.

4. Если листов, указанных в предыдущем пункте в Excel-документе нет, то скрипт их (листы) создаёт, если же есть то двигается далее.

5. Скрипт создаёт таблицу по образцу и вносит собранные из отчётов данные в таблицу по шаблону.

6. Если листы есть, то скрипт лишь обновляет данные в таблицах.


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



Решение:
Как я понимаю начать нужно с парсинга отчётов. Собственно я остановился на этом))
Миниатюры
Скрипт для формирования отчётов о НЕ регламентной перезагрузке   Скрипт для формирования отчётов о НЕ регламентной перезагрузке  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.03.2019, 14:50
Ответы с готовыми решениями:

Компонент для формирования отчетов в Delphi 2009
Здравствуйте! В Delphi7 есть компонент для формирования отчетов. Он обычно находится по следующему пути: c:\Program...

Посоветуйте библиотеку для формирования отчетов в *.pdf, *.doc, *.xls
Доброго времени суток, уважаемые форумчане! В очередной раз поднимаю вопрос об отчетах в C#.NET. Стоит задача выводить информацию о...

Возможность формирования нескольких отчетов, в зависимости от выделенных строк таблицы
Добрый день! Стоит задача отметить несколько строк в таблице и по нажатию кнопки, отправить данные из строк в шаблон для последующей...

49
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
21.03.2019, 16:59  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от KDE777 Посмотреть сообщение
Смысл ещё раз повторять, что уже было показано в #12,14?
Упустил из виду вторую половину 14 ответа.
Но так даже лучше. Собрал конструкцию сам.

Добавлено через 2 минуты
Цитата Сообщение от KDE777 Посмотреть сообщение
Какие же это проблемы?
Проблема не исчезла.

PowerShell
1
2
3
4
5
Отчёт за период с 11.03.2019 по 17.03.2019
 
CompName Monday Tuesday Wednesday Thursday Friday Saturday Sunday
-------- ------ ------- --------- -------- ------ -------- ------
K014          1       1         1        0      0        0      0
Обратите внимание 19.03 (событие, которое совмещается с прошлой неделей) это не понедельник, а вторник.
0
 Аватар для KDE777
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
21.03.2019, 17:51
Цитата Сообщение от StoqJets Посмотреть сообщение
Обратите внимание 19.03
Никакого 19.03 я не вижу, а вижу: "Отчёт за период с 11.03.2019 по 17.03.2019", т.е. в отличие от прошлого раза ("Отчёт за период с 11.03.2019 по 18.03.2019"), как и хотели с понедельника (11.03) до воскресенья (17.03)
0
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
21.03.2019, 18:03  [ТС]
KDE777,

39 коментарий.
https://www.cyberforum.ru/post13423026.html

Дублирую:

Входные данные:
"CompName";"Date";"Time";"RebootReas on"
"K014";"11-03-2019";"15:53:10";"NoReglament"
"K014";"13-03-2019";"15:53:10";"NoReglament"
"K014";"19-03-2019";"15:53:10";"NoReglament"
Если
PowerShell
1
2
...#$NowWeek = $true 
$NowWeek = $false...
то на выходе мы должны получить это:

PowerShell
1
2
3
4
5
Отчёт за период с 11.03.2019 по 18.03.2019
 
CompName Monday Tuesday Wednesday Thursday Friday Saturday Sunday
-------- ------ ------- --------- -------- ------ -------- ------
K014          1       0        1        0      0        0      0
Но вместо отчёта за прошлую неделю получаем это:

PowerShell
1
2
3
4
5
Отчёт за период с 11.03.2019 по 18.03.2019
 
CompName Monday Tuesday Wednesday Thursday Friday Saturday Sunday
-------- ------ ------- --------- -------- ------ -------- ------
K014          1       1         1        0      0        0      0
Обращаем внимание на значение в столбике "Tuesday".
0
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
21.03.2019, 18:08  [ТС]
Этой единицы в столбике "Tuesday" быть не должно, так как по входным данным это уже следующая неделя.
Миниатюры
Скрипт для формирования отчётов о НЕ регламентной перезагрузке  
0
 Аватар для KDE777
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
21.03.2019, 19:35
Цитата Сообщение от StoqJets Посмотреть сообщение
единицы в столбике "Tuesday" быть не должно, так как по входным данным это уже следующая неделя.
Теперь понятно, заголовок отчёта корректный, а фильтр для csv, остался без учёта того, что $ReportStartDate - это теперь последний или предпоследний понедельники. Т.е. Date из csv, теперь нужно сравнивать, как со StartDate, так и с EndDate.

Ничего сложного:

PowerShell
1
Import-Csv $directory\RebootReport.csv -del ';' | ? {(date $_.Date) -ge $ReportStartDate -and (date $_.Date) -le $ReportEndDate} | ? {$_.RebootReason -eq 'NoReglament'}
Кликните здесь для просмотра всего текста
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
$NowWeek = $true
#$NowWeek = $false
 
$n = 0
Do    {$monday = (Get-Date '0:00:00').AddDays(-$n); $n++}
Until ($monday.DayOfWeek -eq "Monday")
 
if ($NowWeek)
{
    # Показать отчёт по текущую дату:
    $ReportEndDate = Get-Date '0:00:00'
    # Показать отчёт от этой даты:
    $ReportStartDate = $monday
}
else
{
    # Показать отчёт по текущую дату:
    $ReportEndDate = $monday.AddDays(-1)
    # Показать отчёт от этой даты:
    $ReportStartDate = $monday.AddDays(-7)
}
 
($ReportStartDate - (date $t.Date)).Days
 
$DaysOfWeek = [System.DayOfWeek].GetEnumValues()[1..6+0]
 
$result = Import-Csv $directory\RebootReport.csv -del ';' | ? {(date $_.Date) -ge $ReportStartDate -and (date $_.Date) -le $ReportEndDate} | ? {$_.RebootReason -eq 'NoReglament'} | group CompName | ForEach {
 
    $data = New-Object PSCustomObject
    $data | Add-Member 'CompName' $_.Name
    $DaysOfWeek | ForEach {$data | Add-Member $_ 0}
 
    ($_.Group | Group Date).Group | ForEach {$data."$((date $_.Date).DayOfWeek)"++}
    $data
    
}
 
$start, $end = $ReportStartDate.ToShortDateString(),$ReportEndDate.ToShortDateString()
 
$txt = "Отчёт за период с $start по $end"
$txt; $result | ft -a
 
$out = "$directory\RebootReportALL_$start`_$end.csv"
$result | Export-Csv -Path $out -del ';' -enc UTF8 -NoType
 
##########
 
$html_body = "<html><body><p><span style='font-weight:bold'>$txt</span><BR></p></body></html>"
$html_body+= $result | ConvertTo-Html
 
$From       = 'from@mydomain.ru'
$To         = 'to@mydomain.ru'
$Subject    = 'Отчёт за неделю'
$SmtpServer = 'smtp.mydomain.ru'
$Port       = '587'
 
$Username   = $From
$Password   = "yourpassword"
 
$SecPassword = $Password | Convertto-SecureString -AsPlainText -Force
$Credential  = New-Object -TypeName System.Management.Automation.PSCredential -Argumentlist $Username,$SecPass
 
Send-MailMessage -From $From `
 -To $To `
 -Body ($html_body | Out-String) `
 -Subject $Subject `
 -Attachments $out `
 -SmtpServer $SmtpServer `
 -Port $Port `
 -Encoding ([System.Text.Encoding]::UTF8) `
 -BodyAsHtml `
 -Credential $Credential


Добавлено через 9 минут

Не по теме:

StoqJets, занятно, что вы не поленились написать обширные комментарии к скрипту, зачем-то поделиться этапами перехода на VSC, проиллюстрировать скриншотами, как здорово выглядит VSC, продублировать посты об отправки почты через PS, но при этом, так и не вникли в логику работы скрипта решающего задачу из темы :)

1
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
21.03.2019, 21:06  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
($ReportStartDate - (date $t.Date)).Days

Кликните здесь для просмотра всего текста
Чтобы жизнь мёдом не казалась


Спасибо, теперь всё работает.

Не по теме:

Цитата Сообщение от KDE777 Посмотреть сообщение
занятно, что вы не поленились написать обширные комментарии к скрипту, зачем-то поделиться этапами перехода на VSC, проиллюстрировать скриншотами, как здорово выглядит VSC, продублировать посты об отправки почты через PS
Всё просто.
Преследую три цели:
-проговаривание помогает в понимании процессов
-ставлю себя на место читающих данную тему. Информация должна быть максимально полной и полезной, желательно с пояснениями, небольшим подитогом от автора.
-помочь таким же новичкам в PowerShell как и я. Своими пояснениями снижаю порог входа в изучение PowerShell для других людей ("поделиться этапами перехода на VSC", пояснения работы скрипта).

Цитата Сообщение от KDE777 Посмотреть сообщение
но при этом, так и не вникли в логику работы скрипта решающего задачу из темы
Я довольно много вывел и узнал для себя из этой темы.
Сам факт того, что я собрал всю конструкцию вместе уже большое дело для меня.
Вам то это понятно семечки.
Что касается основного кода, всему свое время, пока что это сложно, многое непонятно как работает. Будет время - разберусь.

0
 Аватар для KDE777
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
22.03.2019, 10:03
Цитата Сообщение от StoqJets Посмотреть сообщение
($ReportStartDate - (date $t.Date)).Days
Это осталось от отладки, 23 строку из #45 просто удалить.
0
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
22.03.2019, 10:14  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
Это осталось от отладки, 23 строку из #45 просто удалить.
А я думал это такой способ меня проверить))
В любом случае лишнюю строку обнаружил, убрал - всё работает.

Добавлено через 7 минут
KDE777, Вообщем код работает. Корректно формирует общий файл, таблицу, отправляет письмо.
Всё работает как нужно. Но.

В выводе есть ошибка:
Кликните здесь для просмотра всего текста
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Get-Date : Не удается привязать параметр "Date". Не удается преобразовать значение "" в т
ип "System.DateTime". Ошибка: "Строка не распознана как действительное значение DateTime.
"
D:\User_files\Google_Disk_Soft\Scripts\SborINF-and-WeekAnaliz\1.ThisWeek-SborINF-and-Anal
iz.ps1:91 знак:73
+ ... sv $directory\RebootReportALL.csv -del ';' | ? {(date $_.Date) -ge $R ...
+                                                           ~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-Date], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Comman 
   ds.GetDateCommand
 
Get-Date : Не удается привязать параметр "Date". Не удается преобразовать значение "" в т
ип "System.DateTime". Ошибка: "Строка не распознана как действительное значение DateTime.
"
D:\User_files\Google_Disk_Soft\Scripts\SborINF-and-WeekAnaliz\1.ThisWeek-SborINF-and-Anal
iz.ps1:91 знак:73
+ ... sv $directory\RebootReportALL.csv -del ';' | ? {(date $_.Date) -ge $R ...
+                                                           ~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-Date], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Comman 
   ds.GetDateCommand


91 строка, о которой идёт речь в логе:
PowerShell
1
$result = Import-Csv $directory\RebootReportALL.csv -del ';' | ? {(date $_.Date) -ge $ReportStartDate -and (date $_.Date) -le $ReportEndDate} | ? {$_.RebootReason -eq 'NoReglament'} | group CompName | ForEach {
0
 Аватар для KDE777
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
22.03.2019, 10:18
Цитата Сообщение от StoqJets Посмотреть сообщение
Get-Date : Не удается привязать параметр "Date". Не удается преобразовать значение "" в тип "System.DateTime". Ошибка: "Строка не распознана как действительное значение DateTime.
Ну так всё же ясно написано: в csv, в колонке Date - есть или пустые значения (почему?) или то, что не является датой (почему?).
1
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
22.03.2019, 10:54  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
есть или пустые значения (почему?) или то, что не является датой (почему?).
Так и есть. Обнаружил некорректные входные отчёты. Удалил.
Теперь ошибок нет. Прям приятно на вывод смотреть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.03.2019, 10:54

Как заставить jquery-скрипт работать при перезагрузке контента AJAX-ом?
Добрый день! Вопрос следующий. У меня есть скрипт JQuery, который добавляет определенный код после каждого 4-го div таким вот образом:. ...

Скрипт не реагирует после формирования блока
Здравствуйте, пишу сайт, пока немного разбираюсь в технологии Ajax, сверстал главную страничку, слева меню, хеадер, футер и центральный...

При обновлении конфигурации не все формы регламентной отчетности обновились
Здравствуйте. Бухгалтерия предприятия, редакция 2.0 После последнего обновления конфигурации в мониторе Интернет-поддержки...

Пустой список отчетов в справочнике Варианты Отчетов в УТ 11
Друзья, выручайте. В УТ 11 справочник Варианты Отчетов - пуст. Как его заполнить?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
50
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru