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

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

06.03.2019, 14:50. Показов 4323. Ответов 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
06.03.2019, 14:56  [ТС]
На скриншотах образцов - красные клетки означают, что была НЕ регламентная перезагрузка, цифра внутри клетки обозначает кол-во перезагрузок.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
06.03.2019, 15:06
Цитата Сообщение от StoqJets Посмотреть сообщение
в отдельный лог-файл записывают только НЕ регламентные перезагрузки (произошедшие по причинам сбоя в работе ПК).
Если на ПК, где фиксируются перезагрузки, создавать не файл с произвольным текстом, а csv-отчёт (RebootReport.csv), например такого вида:

CompName;Date;Time;RebootReason
P133;05-03-2019;09:50:00;Reglament
P133;04-03-2019;;
P133;03-03-2019;12:00:00;NoReglament
P133;03-03-2019;10:00:00;Reglament
Тогда и никакого сложного парсинга/анализа не потребуется...
0
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
06.03.2019, 20:38  [ТС]
Благодарю за ответ. Я не совсем понимаю что мне даст переход на csv?
Анализировать файл, пускай он будет в формате csv и шаблон заполнения отчёта будет другой, в любом случае нужно или я не прав?

Опять же как желаемую таблицу построить?

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

Не по теме:

Очень мало времени отведено на редактирование ответа.



Редактирую последнюю строчку предыдущего сообщения:
Опять же как собрать всю инфу в один файл и желаемую таблицу построить?
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
06.03.2019, 21:12
Цитата Сообщение от StoqJets Посмотреть сообщение
Анализировать файл, пускай он будет в формате csv и шаблон заполнения отчёта будет другой, в любом случае нужно или я не прав?
В том то и дело - анализировать структурированные данные, а не парсить простыню текста.

Подобные сsv-отчёты со всех ПК очень легко слить в одну csv-таблицу:

RebootReport.csv

Кликните здесь для просмотра всего текста
CompName;Date;Time;RebootReason
P133;05.02.2019;09:50:00;Reglament
P133;05.02.2019;12:50:00;NoReglament
P122;05.02.2019;09:50:00;NoReglament
P133;03.03.2019;12:00:00;NoReglament
P133;03.03.2019;10:00:00;Reglament
P122;03.03.2019;12:00:00;NoReglament
P122;04.03.2019;10:00:00;Reglament
P133;04.03.2019;14:00:00;NoReglament
P133;03.03.2019;10:00:00;Reglament
P112;05.03.2019;15:00:00;NoReglament
P133;06.03.2019;16:00:00;Reglament


а далее выбираете данные любым разумным образом:

PowerShell
1
2
3
4
5
"Количество не регламентных перезагрузок по ПК (за последние 7 дней):"
Import-Csv .\RebootReport.csv -del ';' | ? {(date $_.Date) -ge (date).AddDays(-7) -and $_.RebootReason -eq 'NoReglament'} | group CompName | select Name,Count
 
"Количество не регламентных перезагрузок по дням:"
Import-Csv .\RebootReport.csv -del ';' | ? RebootReason -eq 'NoReglament' | group Date | select @{N='Date';E={$_.Name}},Count,@{N='Comp';E={($_.Group).CompName -join ', '}}
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Количество не регламентных перезагрузок по ПК (за последние 7 дней):
 
Name Count
---- -----
P133     2
P122     1
P112     1
 
 
Количество не регламентных перезагрузок по дням:
 
Date       Count Comp      
----       ----- ----      
05.02.2019     2 P133, P122
03.03.2019     2 P133, P122
04.03.2019     1 P133      
05.03.2019     1 P112
Добавлено через 10 минут
Цитата Сообщение от StoqJets Посмотреть сообщение
Опять же как собрать всю инфу в один файл
PowerShell
1
((Get-ChildItem .\p*.csv).FullName | Import-Csv -del ';') | Export-Csv .\RebootReportAll.csv -del ';' -enc UTF8 -NoType
1
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
07.03.2019, 11:30
+ ещё один пример, делаем аналог отчёта с вашей второй картинки:

RebootReport.csv
Кликните здесь для просмотра всего текста
CompName;Date;Time;RebootReason
P133;05.02.2019;09:50:00;Reglament
P133;05.02.2019;12:50:00;NoReglament
P122;05.02.2019;09:50:00;NoReglament
P133;01.03.2019;12:00:00;NoReglament
P133;01.03.2019;10:00:00;Reglament
P122;01.03.2019;12:00:00;NoReglament
P122;02.03.2019;10:00:00;Reglament
P133;02.03.2019;14:00:00;NoReglament
P133;02.03.2019;10:00:00;Reglament
P112;02.03.2019;15:00:00;NoReglament
P133;02.03.2019;16:00:00;Reglament
P133;02.03.2019;14:00:00;NoReglament
P133;03.03.2019;12:00:00;NoReglament
P133;03.03.2019;10:00:00;Reglament
P122;03.03.2019;12:00:00;NoReglament
P122;04.03.2019;10:00:00;Reglament
P133;04.03.2019;14:00:00;NoReglament
P133;03.03.2019;10:00:00;Reglament
P112;05.03.2019;15:00:00;NoReglament
P133;05.03.2019;14:00:00;NoReglament
P133;03.03.2019;17:00:00;Reglament
P112;05.03.2019;18:00:00;NoReglament
P133;06.03.2019;16:00:00;Reglament
P133;04.03.2019;14:00:00;NoReglament
P133;03.03.2019;10:00:00;Reglament
P112;05.03.2019;5:00:00;NoReglament
P133;05.03.2019;14:00:00;NoReglament
P133;03.03.2019;10:00:00;Reglament
P112;05.03.2019;10:00:00;NoReglament
P133;03.03.2019;10:00:00;Reglament
P112;05.03.2019;5:00:00;NoReglament
P133;06.03.2019;16:00:00;Reglament
P133;06.03.2019;10:00:00;NoReglament
P133;06.03.2019;16:00:00;Reglament
P133;06.03.2019;18:00:00;NoReglament
P122;06.03.2019;12:00:00;NoReglament
P133;07.03.2019;16:00:00;Reglament
P133;07.03.2019;14:00:00;NoReglament
P133;07.03.2019;10:00:00;Reglament
P112;07.03.2019;10:00:00;NoReglament
P133;07.03.2019;16:00:00;Reglament


PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$DaysOfWeek = 0..6 | ForEach {(date 7-01-2019).AddDays($_).DayOfWeek}
 
$result = Import-Csv .\RebootReport.csv -del ';' | ? {(date $_.Date) -ge (date).AddDays(-7) -and $_.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
}
 
"Отчёт о перезагрузках ПК за неделю"
$result | ft -a
#$result | Export-Csv -Path $out -del ';' -enc UTF8 -NoType
Code
1
2
3
4
5
6
7
Отчёт о перезагрузках ПК за неделю
 
CompName Monday Tuesday Wednesday Thursday Friday Saturday Sunday
-------- ------ ------- --------- -------- ------ -------- ------
P133          2       2         2        1      1        2      1
P122          0       0         1        0      1        0      1
P112          0       5         0        1      0        1      0
1
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
08.03.2019, 19:29  [ТС]
В своих скриптах запись в лог файл я выполнял так:

PowerShell
1
"$dateFORlogs - Касса включена - регламентная перезагрузка." | Out-File $directory\p133RebootReport.txt –Append
После вашего предложения перейти на csv сделал так:
PowerShell
1
"p133;$dateFORcsv;$timeFORcsv;NoReglament" | Out-File $directory\p133RebootReport.csv –Append
Получилась не рабочая ерунда (кракозябра при открытии данного документа в Excel), ну я же не знал, что в формат csv нужно сохранять другими командами)

В итоге нашёл команду, которая сохраняет в csv.
Сделал так:

PowerShell
1
"p555;$dateFORcsv;$timeFORcsv;NoReglament" | Export-Csv -Append -NoTypeInformation -Path $directory\p133RebootReport.csv
Уже ближе, но снова ерунда.
Кстати, в процессе натолкнулся на тему от 2016 года, там автор допустил такую же досадную ошибку в процессе экспорта отчёта, видимо популярна ошибка у новичков - Экспорт результатов в CSV.

Так что кодом вашим не воспользуюсь пока не решу проблему с экспортом.

Добавлено через 1 час 28 минут
Методом тыка удалось нарыть рабочий код:
PowerShell
1
Get-Service |Select-Object "p555;$dateFORcsv;$timeFORcsv;NoReglament"|Export-Csv $directory\test.csv
Выдача данной команды:
PowerShell
1
2
#TYPE Selected.System.ServiceProcess.ServiceController
"p555;08-03-2019;20:11:12;NoReglament"
Одна проблема добавляет 1-ую строчку (#TYPE Selected.System.ServiceProcess.ServiceCo ntroller), которая портит всю картину.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
09.03.2019, 11:39
Цитата Сообщение от StoqJets Посмотреть сообщение
После вашего предложения перейти на csv сделал так:
PowerShell
1
"p133;$dateFORcsv;$timeFORcsv;NoReglament" | Out-File $directory\p133RebootReport.csv –Append
Получилась не рабочая ерунда (кракозябра при открытии данного документа в Excel), ну я же не знал, что в формат csv нужно сохранять другими командами)
Можно и вручную формировать csv-текст:

PowerShell
1
2
3
4
5
$out = "$directory\$env:COMPUTERNAME`_RebootReport.csv"
 
"CompName;Date;Time;RebootReason" | Set-Content -Path $out -Encoding UTF8
# ....
"$env:COMPUTERNAME;$dateFORcsv;$timeFORcsv;NoReglament" | Add-Content -Path $out -Encoding UTF8
Цитата Сообщение от StoqJets Посмотреть сообщение
Методом тыка удалось нарыть рабочий код:
Это не рабочий код, а какое-то недоразумение

Цитата Сообщение от StoqJets Посмотреть сообщение
пока не решу проблему с экспортом
PowerShell
1
2
3
4
5
6
7
8
$out = "$directory\$env:COMPUTERNAME`_RebootReport.csv"
 
[PSCustomObject]@{
    CompName     = $env:COMPUTERNAME
    Date         = $dateFORcsv
    Time         = $timeFORcsv
    RebootReason = 'NoReglament'
} | Export-Csv -Path $out -NoType -Delimiter ';' -Append -Encoding UTF8
1
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
09.03.2019, 13:38  [ТС]
KDE777,


PowerShell
1
2
3
4
5
6
7
8
$out = "$directory\$env:COMPUTERNAME`_RebootReport.csv"
 
[PSCustomObject]@{
    CompName     = $env:COMPUTERNAME
    Date         = $dateFORcsv
    Time         = $timeFORcsv
    RebootReason = 'NoReglament'
} | Export-Csv -Path $out -NoType -Delimiter ';' -Append -Encoding UTF8
Круто! Отчёты создаются.



Сбор инфы в один файл.

Входные данные. 3 файла:
p166RebootReport.csv
PowerShell
1
2
p166;09-03-2019;14:44:42;NoReglament
p166;10-03-2019;14:44:42;NoReglament
p222RebootReport.csv
PowerShell
1
2
p222;09-03-2019;14:44:42;NoReglament
p222;11-03-2019;14:44:42;NoReglament
p333RebootReport.csv
PowerShell
1
2
p333;09-03-2019;14:44:42;NoReglament
p333;13-03-2019;14:44:42;NoReglament



PowerShell
1
2
3
$directory = "H:\Project\TEST\AnalizReports"
 
((Get-ChildItem $directory\OtherLogs\p*.csv).FullName | Import-Csv -del ';') | Export-Csv $directory\RebootReport.csv -del ';' -enc UTF8 -NoType

Результат работы скрипта:

PowerShell
1
2
3
4
"p166";"09-03-2019";"14:44:42";"NoReglament"
"p166";"10-03-2019";"14:44:42";"NoReglament"
;"11-03-2019";"14:44:42";"NoReglament"
;"13-03-2019";"14:44:42";"NoReglament"

Скрипт переносит данные не из всех файлов (1), часть данных удалена (2), скрипт добавляет кавычки (3), которые я полагаю в дальнейшем помешают работе других скриптов или нет?

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

Плюс ко всему, верно ли я понимаю, что для корректной работы следующего скрипта (который уже анализирует данные) в начале файла csv должна быть строка CompNameate;Time;RebootReason и эту строку должен добавлять скрипт, который объединяет лог-файлы?
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
09.03.2019, 14:22
Цитата Сообщение от StoqJets Посмотреть сообщение
Входные данные. 3 файла:
Данные некорректны, нет csv-заголовков. Из этого следуют и все дальнейшие проблемы. Создавайте csv-файлы, как показал я ([PSCustomObject] | Export-Csv) и все остальные примеры будут работать как надо. Кавычки ничему не помешают, это как раз результат работы Export-Csv

Для проверки:

PowerShell
1
(Get-ChildItem $directory\OtherLogs\p*.csv).FullName | Import-Csv -del ';' | Out-GridView
должна отобразиться таблица с заголовками столбцов и данными из всех файлов.
0
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
09.03.2019, 20:09  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
Данные некорректны, нет csv-заголовков. Из этого следуют и все дальнейшие проблемы.
Просто . Моя невнимательность.

Я использую в работе весь код, что вы предоставили, полезные штуки.

Скажите, пожалуйста, ещё один момент. Как можно в отчёт добавить период дат, за который показаны данные?
Т.е. не просто в экран консоли вывести период, а записать этот период в отчёт (в идеале первой строкой).


Что-то типа этого:

PowerShell
1
2
3
4
5
6
7
Отчёт за период  01-03-2019 - 07-03-2019.
 
CompName Monday Tuesday Wednesday Thursday Friday Saturday Sunday
-------- ------ ------- --------- -------- ------ -------- ------
P133          2       2         2        1      1        2      1
P122          0       0         1        0      1        0      1
P112          0       5         0        1      0        1      0
Добавлено через 1 час 38 минут
Вообщем, в итоге сделал так:

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
chcp 1251
$dateFORcsv = get-date -Format dd-MM-yyy
$timeFORcsv = get-date -Format HH:mm:ss
 
 
# Ключевые настройки
$directory = "H:\Project\TEST\AnalizReports"
# Показать отчёт по текущую дату:
$ReportEndDate = "9-03-2019"
# Показать отчёт от этой даты:
$ReportStartDate = get-date (Get-Date $ReportEndDate).adddays(-7) -f ("dd-MM-yyy")
 
 
$DaysOfWeek = 0..6 | ForEach {(date $ReportEndDate).AddDays($_).DayOfWeek}
 
$result = Import-Csv $directory\RebootReport.csv -del ';' | ? {(date $_.Date) -ge (date).AddDays(-7) -and $_.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
    
}
 
"Отчёт о перезагрузках ПК за неделю"
$result | ft -a
$result | Export-Csv -Path $directory\RebootReportALL.csv -del ';' -enc UTF8 -NoType
 
Add-Content $directory\RebootReportALL.csv "Отчёт за период с $ReportStartDate по $ReportEndDate"
Вывод данной команды (в cvs сохраняет корректно):
Кликните здесь для просмотра всего текста
PowerShell
1
2
3
4
5
6
"CompName";"Thursday";"Friday";"Saturday";"Sunday";"Monday";"Tuesday";"Wednesday"
"MACHINE-JGJ60U5";"0";"0";"1";"0";"0";"0";"0"
"p166";"0";"0";"1";"1";"0";"0";"0"
"p222";"0";"0";"1";"0";"1";"0";"0"
"p333";"0";"0";"1";"0";"0";"0";"1"
Отчёт за период с 02-03-2019 по 9-03-2019


Можно в одном месте менять даты и для формирования отчёта и для вывода дат.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
11.03.2019, 12:19
Цитата Сообщение от StoqJets Посмотреть сообщение
Вообщем, в итоге сделал так:
Восемь вызовов get-date - это сильно

Цитата Сообщение от StoqJets Посмотреть сообщение
Скажите, пожалуйста, ещё один момент. Как можно в отчёт добавить период дат, за который показаны данные?
Т.е. не просто в экран консоли вывести период, а записать этот период в отчёт (в идеале первой строкой).
В csv-ничего кроме данных желательно ничего не добавлять... В этом случае можно внести данные о диапазоне отчёта в имя файла или, например, отправить таблицу с отчётом в html-формате по почте.

Кликните здесь для просмотра всего текста
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
# Ключевые настройки
$directory = "H:\Project\TEST\AnalizReports"
# Показать отчёт по текущую дату:
$ReportEndDate = Get-Date '0:00:00'
# Показать отчёт от этой даты:
$ReportStartDate = $ReportEndDate.AddDays(-7)
 
$DaysOfWeek = 0..6 | ForEach {$ReportEndDate.AddDays($_).DayOfWeek}
 
$result = Import-Csv $directory\RebootReport.csv -del ';' | ? {(date $_.Date) -ge $ReportStartDate -and $_.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
 
Send-MailMessage -From 'from@mydomain.ru' `
 -To 'to@mydomain.ru' `
 -Body ($html_body | Out-String) `
 -Subject 'Отчёт за неделю' `
 -Attachments $out `
 -SmtpServer 'smtp.mydomain.ru' `
 -Port 25 `
 -Encoding ([System.Text.Encoding]::UTF8) `
 -BodyAsHtml
1
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
11.03.2019, 12:37  [ТС]
PowerShell
1
2
3
4
5
6
7
8
9
Send-MailMessage -From 'from@mydomain.ru' `
 -To 'to@mydomain.ru' `
 -Body ($html_body | Out-String) `
 -Subject 'Отчёт за неделю' `
 -Attachments $out `
 -SmtpServer 'smtp.mydomain.ru' `
 -Port 25 `
 -Encoding ([System.Text.Encoding]::UTF8) `
 -BodyAsHtml
В данном коде не фигурирует пароль от почтового ящика. Разве так можно отправить письмо?
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
11.03.2019, 12:44
Цитата Сообщение от StoqJets Посмотреть сообщение
Разве так можно отправить письмо?
Если вы являетесь администратором этого сервера то можно Например, IP хоста отправляющего отчёты, добавляется в анонимный receive connector. А ещё Send-MailMessage может использовать Windows Integrated Authentication...

Если же нужен логин/пароль, то это тоже не проблема:

PowerShell
1
2
3
4
5
6
7
$Username = $From
$Password = "yourpassword"
 
$SecPassword = $Password | Convertto-SecureString -AsPlainText -Force
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -Argumentlist $Username,$SecPassword
 
Send-MailMessage ... -Port 587 -Credential $Credential
1
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
11.03.2019, 13:17  [ТС]
KDE777,

Собрал конструкцию. Всё работает. Ошибок нет. Огромное Вам спасибо.

Кликните здесь для просмотра всего текста


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
# Показать отчёт от этой даты:
$ReportStartDate = $ReportEndDate.AddDays(-7)
 
$DaysOfWeek = 0..6 | ForEach {$ReportEndDate.AddDays($_).DayOfWeek}
 
$result = Import-Csv $directory\RebootReportALL.csv -del ';' | ? {(date $_.Date) -ge $ReportStartDate -and $_.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\RebootReport-WeekAnaliz.csv_$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 = "user_name@gmail.com"
$To = "user_name@gmail.com"
$SMTPServer = "smtp.gmail.com"
$SMTPPort = "587"
$Username = "user_name"
$Password = 'password'
$subject = "subject"
 
 
#формируем сообщение в формате html:
$message = New-Object System.Net.Mail.MailMessage $From, $To
$attachment = $out
$message.Attachments.Add($attachment)
$message.Subject = $subject
$message.IsBodyHTML = $true
$message.Body = $html_body
 
#Отправляем:
$smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort)
$smtp.EnableSSL = $true
$smtp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password)
$smtp.Send($message)


В планах сделать такой же отчёт за месяц и подведение итогов по данной теме (опишу как реализовано у меня), возможно, кому-либо пригодится данный инструмент.
0
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
12.03.2019, 14:43  [ТС]
KDE777,
Возможно ли ещё как-то зафиксировать дни недели, чтобы они не бегали по всей таблице?)
Миниатюры
Скрипт для формирования отчётов о НЕ регламентной перезагрузке   Скрипт для формирования отчётов о НЕ регламентной перезагрузке   Скрипт для формирования отчётов о НЕ регламентной перезагрузке  

Скрипт для формирования отчётов о НЕ регламентной перезагрузке  
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
12.03.2019, 15:12
Цитата Сообщение от StoqJets Посмотреть сообщение
зафиксировать дни недели, чтобы они не бегали по всей таблице?
В изначальном примере, так и было сделано:

PowerShell
1
$DaysOfWeek = 0..6 | ForEach {(date 7-01-2019).AddDays($_).DayOfWeek}
т.е., массив $DaysOfWeek формируется с даты любого известного понедельника.

Добавлено через 2 минуты
Иначе, я предположил, что этот скрипт будет запускаться из планировщика раз в неделю и тогда порядок дней недели будет постоянным.
0
 Аватар для v_svitere
774 / 423 / 137
Регистрация: 03.06.2009
Сообщений: 1,223
Записей в блоге: 4
12.03.2019, 16:00
StoqJets,
Возможно ли ещё как-то зафиксировать дни недели, чтобы они не бегали по всей таблице?)
PowerShell
1
$daysofweek=[System.DayOfWeek].GetEnumValues()
Добавлено через 11 минут
PowerShell
1
$daysofweek=[System.DayOfWeek].GetEnumValues()[1,2,3,4,5,6,0]
Это если с понедельника
2
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
12.03.2019, 16:15
Цитата Сообщение от v_svitere Посмотреть сообщение
PowerShell
1
$daysofweek=[System.DayOfWeek].GetEnumValues()[1,2,3,4,5,6,0]
Это если с понедельника
PowerShell
1
[System.DayOfWeek].GetEnumValues()[1..6+0]
1
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
19.03.2019, 14:03  [ТС]
v_svitere, KDE777, благодарю.

PowerShell
1
$daysofweek=[System.DayOfWeek].GetEnumValues()
Идеально для меня. Отображает корректно столбцы с днями при запуске в любой день недели.


Скрипт работает отлично. Фактически на этом можно было бы и остановиться. Но))

Скрипт запускаю вручную (знаю, что можно добавить в планировщик) (точнее запускаю exe-файл предварительно скомпилированный с помощью PowerGui Script Editor). Каждую неделю, чтобы отобразилась инфа за прошлую неделю или за текущую я указываю в скрипте в переменную $ReportEndDate дату понедельника на этой неделе или следующей.

PowerShell
1
2
3
$ReportEndDate = "18-03-2019"
# Показать отчёт от этой даты:
$ReportStartDate = get-date (Get-Date $ReportEndDate).adddays(-7) -f ("dd-MM-yyy")
Хочу сделать два скрипта:
при запуске одного - приходит отчёт за прошлую неделю.
при запуске другого - приходит отчёт за текущую неделю.
Можно ли это как-то реализовать?

Добавлено через 5 минут
Хочется безумно автоматизации. )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.03.2019, 14:03
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru