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

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

06.03.2019, 14:50. Показов 4802. Ответов 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
 Аватар для KDE777
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
19.03.2019, 14:10
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от StoqJets Посмотреть сообщение
точнее запускаю exe-файл предварительно скомпилированный с помощью PowerGui Script Editor
Зачем???? Из планировщика можно/нужно запускать просто powershell.exe с параметрами -ExecutionPolicy Bypass -File "C:\Scripts\Report.ps1"

Добавлено через 2 минуты
Цитата Сообщение от StoqJets Посмотреть сообщение
Каждую неделю, чтобы отобразилась инфа за прошлую неделю или за текущую я указываю в скрипте в переменную $ReportEndDate дату понедельника на этой неделе или следующей.
Ещё более странное решение... В планировщике есть триггер - Еженедельно, каждый понедельник.
0
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
19.03.2019, 14:14  [ТС]
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")
Хочу сделать два скрипта:
при запуске одного - приходит отчёт за прошлую неделю, без необходимости указывать в скрипте дату понедельника на этой неделе.
при запуске другого - приходит отчёт за текущую неделю, без необходимости указывать в скрипте дату понедельника на следующей неделе.

В данных случаях скрипт "пляшет" от даты запуска скрипта.
Возможно ли это реализовать?
0
 Аватар для KDE777
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
19.03.2019, 14:22
Цитата Сообщение от StoqJets Посмотреть сообщение
при запуске одного - приходит отчёт за прошлую неделю.
Не надо задавать вручную никаких дат, я вам всё уже показал в #12 и запускайте этот скрипт с триггером "Еженедельно, каждый понедельник"

PowerShell
1
2
3
4
# Показать отчёт по текущую дату:
$ReportEndDate = Get-Date '0:00:00'
# Показать отчёт от этой даты:
$ReportStartDate = $ReportEndDate.AddDays(-7)
Цитата Сообщение от StoqJets Посмотреть сообщение
при запуске другого - приходит отчёт за текущую неделю
Зачем, если раз в неделю вам приходит по отчёту? Но если хотите, то можно например сделать триггер "Еженедельно, каждый понедельник, пятница" и в скрипте добавить проверку - если сегодня понедельник, тогда: $ReportEndDate.AddDays(-7), а если пятница, например, $ReportEndDate.AddDays(-5)

Добавлено через 4 минуты
Цитата Сообщение от StoqJets Посмотреть сообщение
В данных случаях скрипт "пляшет" от даты запуска скрипта.
Для этого и нужно использовать корректный триггер в планировщике...
0
 Аватар для v_svitere
774 / 423 / 137
Регистрация: 03.06.2009
Сообщений: 1,223
Записей в блоге: 4
19.03.2019, 14:28
StoqJets,
Хочется безумно автоматизации. )
Не совсем понял что имеется вввиду?
Вы можете в скрипт передавать аргумент, который будет участвовать в логике. То есть передаете ему параметр например "Previos" или "Now", и в зависимости от этого параметра происходит выполнение условия.
Таким образом получится 1 скрипт, которые может вести себя по разному в зависимости от параметра

PowerShell
1
$ReportStartDate = get-date (Get-Date $ReportEndDate).adddays(-7) -f ("dd-MM-yyy")
Какая-то странная запись с двумя вызовами get-date
Не проще ли так?
PowerShell
1
$ReportStartDate=[datetime]::Parse("18-03-2019").AddDays(-7).ToString("dd-MM-yyy")
0
 Аватар для KDE777
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
19.03.2019, 14:32
Цитата Сообщение от v_svitere Посмотреть сообщение
Какая-то странная запись с двумя вызовами get-date
В полной версии скрипта (#11), 8 вызовов get-date
0
 Аватар для v_svitere
774 / 423 / 137
Регистрация: 03.06.2009
Сообщений: 1,223
Записей в блоге: 4
19.03.2019, 14:34
KDE777,
О и вправду, что это я привязался к всего-то двум вызовам)
0
19.03.2019, 14:35

Не по теме:

Цитата Сообщение от v_svitere Посмотреть сообщение
Не проще ли так?
Я автору темы уже показал готовое решение в #12, но он почему-то продолжает странное изобретательство... :)

0
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
20.03.2019, 03:39  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
Зачем???? Из планировщика можно/нужно запускать просто powershell.exe с параметрами -ExecutionPolicy Bypass -File "C:\Scripts\Report.ps1"
Ну вот нравится мне компилировать ) Плюс ко всему предпочитаю все настройки хранить в одном месте, т.е. в скрипте. Эта настройка выходит за рамки скрипта.

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

Цитата Сообщение от KDE777 Посмотреть сообщение
Зачем, если раз в неделю вам приходит по отчёту? Но если хотите, то можно например сделать триггер "Еженедельно, каждый понедельник, пятница" и в скрипте добавить проверку - если сегодня понедельник, тогда: $ReportEndDate.AddDays(-7), а если пятница, например, $ReportEndDate.AddDays(-5)
Это уже ближе. Скрипт запускаю почти каждый день, а не только в пн и пт.

Цитата Сообщение от v_svitere Посмотреть сообщение
Не проще ли так?
Возможно. Тонкостей PowerShell не знаю, юзаю то, что предлагают на форумах, что нахожу на просторах сети и то, что сам собираю по аналогии с другими скриптами.

Видимо я не ясно объяснил, что конкретно хочу реализовать.

Логика следующая (без планировщика, запуск вручную):
1-ый скрипт:
Если сегодня пн, вт, ср, чт, пт, сб, вс,
То покажи отчёт за предыдущую неделю (с корректной расстановкой дней недели в таблице)

2-ой скрипт:
Если сегодня пн, вт, ср, чт, пт, сб, вс,
То покажи отчёт за эту неделю (с корректной расстановкой дней недели в таблице)
0
 Аватар для KDE777
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
20.03.2019, 10:54
Цитата Сообщение от StoqJets Посмотреть сообщение
В своём 20 ответе я писал, что знаю о существовании планировщика, но не считаю нужным его использовать в данной ситуации.
Скрипт запускаю вручную. Под автоматизацией подразумевалось автоматическая подстановка нужной даты.
Если говорить об автоматизации, то это конечно планировщик. Например, отчёт за прошедшую неделю туда просто напрашивается (с триггером "Еженедельно, каждый понедельник"). И тогда не потребуется никаких вычислений текущего дня недели...


Цитата Сообщение от StoqJets Посмотреть сообщение
Логика следующая (без планировщика, запуск вручную):
1-ый скрипт:
Если сегодня пн, вт, ср, чт, пт, сб, вс,
То покажи отчёт за предыдущую неделю (с корректной расстановкой дней недели в таблице)
2-ой скрипт:
Если сегодня пн, вт, ср, чт, пт, сб, вс,
То покажи отчёт за эту неделю (с корректной расстановкой дней недели в таблице)
Всё равно достаточно одного скрипта, с ключом $NowWeek:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$NowWeek = $true
#$NowWeek = $false
 
$n = 0
Do    {$date = (Get-Date '0:00:00').AddDays(-$n); $n++}
Until ($date.DayOfWeek -eq "Monday")
 
if ($NowWeek)
{
    # Показать отчёт по текущую дату:
    $ReportEndDate = Get-Date '0:00:00'
    # Показать отчёт от этой даты:
    $ReportStartDate = $date
}
else
{
    # Показать отчёт по текущую дату:
    $ReportEndDate = $date
    # Показать отчёт от этой даты:
    $ReportStartDate = $date.AddDays(-7)
}
а далее, как уже показывал:

Кликните здесь для просмотра всего текста
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
$NowWeek = $true
#$NowWeek = $false
 
$n = 0
Do    {$date = (Get-Date '0:00:00').AddDays(-$n); $n++}
Until ($date.DayOfWeek -eq "Monday")
 
if ($NowWeek)
{
    # Показать отчёт по текущую дату:
    $ReportEndDate = Get-Date '0:00:00'
    # Показать отчёт от этой даты:
    $ReportStartDate = $date
}
else
{
    # Показать отчёт по текущую дату:
    $ReportEndDate = $date
    # Показать отчёт от этой даты:
    $ReportStartDate = $date.AddDays(-7)
}
 
$DaysOfWeek = [System.DayOfWeek].GetEnumValues()[1..6+0]
 
$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
20.03.2019, 14:59  [ТС]
KDE777, Великолепно!

Для тех, кто хочет поюзать данный скрипт.
Выкладываю готовое решение. Скорректированное под мои запросы.

1-ый скрипт.
Генерирует отчёты для обработки уже вторым скриптом.

GeneratorCSV.ps1
Кликните здесь для просмотра всего текста
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
# Укажите путь куда будет сгенерирован тестовый отчёт.
$directory = "D:\test\csv"
 
 
$dateFORcsv = get-date -Format dd-MM-yyy
$timeFORcsv = get-date -Format HH:mm:ss
 
$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



2-ой скрипт. Анализирует логи созданные первым скриптом.

AnalizCSV.ps1

Кликните здесь для просмотра всего текста
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<#                    NowWeek
Рабочий код. Ошибок нет. Пути тестовые.
 
Этапы работы скрипта.
1. Удаляет старый отчёт.
2. Собирает инфу из множества отчётов по указанному каталогу рекурсивно (т.е. в целевом каталоге и подкаталогах) и создаёт один общий отчёт.
3. Анализирует общий отчёт и формирует таблицу. 
 3.1. В начале названия файла-таблицы указывается текущая дата. 
 3.2. В конце названия файла-таблицы указывается период, за который составлен отчёт.
 3.3. Отчёт за текущую или прошлую неделю формируется в зависимости от того какая из следующих двух строчек кода активна, а какая закоментирована:
     $NowWeek = $true - раскоментирована эта строка и закоментирована следующая - отчёт будет за текущую неделю.
     $NowWeek = $false - раскоментирована эта строка и закоментирована предыдущая - отчёт будет за прошлую неделю.
!!!  Для корректной работы скрипта одна из этих двух строчек ВСЕГДА должна быть закоментирована. 
!!!  По-умолчанию, обе строки закоментировал.
4. Отправляет таблицу по почте.
 
Нюансы:
1. Второй и последующие запуски (без закрытия PowerGui Script Editor, я использую его для написания скриптов)  данного скрипта вызывают ошибку: 
     "Процесс не может получить доступ к файлу".
Речь идёт конечном файле-таблице, которая отправляется на почту.
Ошибка возникает только в том случае, если файл с таким же названием уже существует.
Файл блокирует та часть скрипта, которая отвечает за отправку отчёта на почту.
Если скомпилировать с помощью PowerGui Script Editor exe-файл, то блокировки файла-отчёта не происходит. Запускаете exe-шник, он отрабатывает и закрывается.
Если используете редактор скриптов (например, PowerGui Script Editor), то для тестирования работы скрипта рекомендую закомментировать блок отправки почты, 
если проверяете создание отчётов, ну либо придётся, чтобы не появлялась вышеупомянутая ошибка, после каждого запуска скрипта закрывать и снова открывать скрипт на редактирование.
 
 
Для работы скрипта достаточно:
1. указать свои пути в блоке "Ключевые настройки скрипта", 
2. выбрать за какую неделю нужен отчёт в том же блоке
3. указать почтовые реквизиты в последнем блоке скрипта.
#>
 
 
 
 
# Ключевые настройки скрипта.
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Входные данные (путь к CSV файлам (сырые данные, полученные со множества ПК), подкаталоги также будут сканироваться):
$directoryAllCSV = "D:\test\csv"
 
# Выходные данные общий отчёт по всем ПК и таблица:
$directory = "D:\test"
 
# Раскоментировать для отчёта за текущую неделю.
#$NowWeek = $true
 
# Раскоментировать для отчёта за прошлую неделю.
#$NowWeek = $false
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
$Today = get-date -Format dd-MM-yyy
 
# Удаление предыдущего общего файла, НЕ файла-таблицы.
Remove-Item $directory\RebootReportALL.csv
 
 
# Сбор инфы из всех cvs-логов в один csv-файл.
((Get-ChildItem $directoryAllCSV\*RebootReport.csv -Recurse).FullName | Import-Csv -del  ';') | Export-Csv $directory\RebootReportALL.csv -del ';' -enc UTF8 -NoType -Append
 
 
 
$n = 0
Do    {$date = (Get-Date '0:00:00').AddDays(-$n); $n++}
Until ($date.DayOfWeek -eq "Monday")
 
if ($NowWeek)
{
    # Показать отчёт по текущую дату:
    $ReportEndDate = Get-Date '0:00:00'
    # Показать отчёт от этой даты:
    $ReportStartDate = $date
}
else
{
    # Показать отчёт по текущую дату:
    $ReportEndDate = $date
    # Показать отчёт от этой даты:
    $ReportStartDate = $date.AddDays(-7)
}
 
  
 $daysofweek=[System.DayOfWeek].GetEnumValues()[1,2,3,4,5,6,0]
 
 
 
$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\$Today-RebootReport-WeekAnaliz_$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
 
  
<#
Здесь необходимо указать свои реквизиты для подключения к почтовому ящику.
 
Если как и я для этой цели будете использовать Gmail, то рекомендую использовать "пароли для приложений", 
чтобы не светить основной пароль от почты (даже при условии, что почта используется не основная).
 
"Пароли для приложений" - данный пункт находится в настройке безопасности Google-аккаунта. 
Этот функционал появляется, по-моему, только после включения двухэтапной аутентификации.
#>
 
#Входящие данные сообщения:
$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
 Аватар для KDE777
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
20.03.2019, 15:18
Цитата Сообщение от StoqJets Посмотреть сообщение
Для корректной работы скрипта одна из этих двух строчек ВСЕГДА должна быть закоментирована.
Ничего подобного

PowerShell
1
2
3
$NowWeek = $true
#$NowWeek = $false
$NowWeek
Code
1
True
PowerShell
1
2
3
$NowWeek = $true
$NowWeek = $false
$NowWeek
Code
1
False
Цитата Сообщение от StoqJets Посмотреть сообщение
По-умолчанию, обе строки закоментировал.
А вот так, я бы не делал, т.к. при повторном запуске скрипта из той же оболочки получится не предсказуемое значение $NowWeek

Цитата Сообщение от StoqJets Посмотреть сообщение
Файл блокирует та часть скрипта, которая отвечает за отправку отчёта на почту.
Используйте Send-MailMessage и PowerShell_ISE, никаких блокировок в этом случае не возникает. PowerGUI Script Editor когда-то было очень хорошим IDE для PS, но оно не обновляется уже 5 лет...
0
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
20.03.2019, 16:19  [ТС]
KDE777,
. Ничего подобного
Полностью согласен. Это лишь условность.
Мне было лень расписывать именно этот пункт, как не являющийся критичным. Нужно постараться, чтобы накосячить, к тому же я дальше расписал что да как.


.А вот так, я бы не делал, т.к. при повторном запуске скрипта из той же оболочки получится не предсказуемое значение $NowWeek
В своём рабочем скрипте я раскоментировал нужную мне строку.
Здесь закоментировал для более полного понимания читающими данный топик.
В инструкции сделаны акценты на этом.

. Send-MailMessage
Обязательно попробую использовать эту команду.

. PowerGUI Script Editor когда-то было очень хорошим IDE для PS, но оно не обновляется уже 5 лет...
На текущий момент я не нашёл аналога лучше.
0
 Аватар для KDE777
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
20.03.2019, 16:37
Цитата Сообщение от StoqJets Посмотреть сообщение
На текущий момент я не нашёл аналога лучше
- Штатно установленное PowerShell ISE + если чего-то не хватает любой Add-On's на выбор
- VS Code + PowerShell extension

Всё это от создателей PS и самых актуальных версий, а не 5-ти летней давности.
1
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
21.03.2019, 09:52  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
- Штатно установленное PowerShell ISE + если чего-то не хватает любой Add-On's на выбор
- VS Code + PowerShell extension
Второй вариант привлекательнее.

Вообщем перехожу с PowerGui Script Editor на VS Code + PowerShell extension.

Этапы перехода:
Кликните здесь для просмотра всего текста
1. Качаем и устанавливаем VS Code по ссылке - https://aka.ms/win32-x64-user-stable (в процессе установки рекомендую поставить галку добавления возможности открытия файлов через VS Code в контекстное меню)
2. Запускаем VS Code. Слева вверху в поиске вбиваем "PowerShell" без кавычек.
3. Устанавливаем нажатием кнопки Install.
4. Если кому нужен русский интерфейс в программе, то в том же окне поиска вбиваем "Russian Language Pack for Visual Studio Code". У меня русский интерфейс включился после установки этого расширения и перезапуска VS Code. Вам возможно потребуется сделать доп. настройку конфигурационного файла (в пару кликов). Инструкция здесь - https://marketplace.visualstud... ge-pack-ru
5. Кракозябры вместо русских букв при открытии через VS Code своих существующих скриптов.
Файл - Параметры - в поиск вбиваем "Auto guess Encoding". Напротив найденного параметра ставим галочку.
У меня после этой настройки русские буквы стали корректно отображаться.


Даже выглядит эта софтина круто, я уж молчу про функционал))

KDE777, благодарю вас.
0
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
21.03.2019, 10:17  [ТС]
Скриншот программы.
Миниатюры
Скрипт для формирования отчётов о НЕ регламентной перезагрузке  
0
 Аватар для KDE777
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
21.03.2019, 10:20
Цитата Сообщение от StoqJets Посмотреть сообщение
Второй вариант привлекательнее.
Кому как.

- огромный плюс ISE в том, что эта IDE штатно уже есть в ОС, т.е. удобное создание/отладка скриптов доступно сразу из коробки.
- у ISE (по умолчанию) более наглядная подсветка синтаксиса: "-ErrorAction SilentlyContinue", "-ComputerName $_", и т.п. - в VSC и ключ и его значение будут одним цветом, а в ISE нет

Цитата Сообщение от StoqJets Посмотреть сообщение
Кракозябры вместо русских букв при открытии через VS Code своих существующих скриптов.
Возьмите за правило сохранять все тексты/скрипты в UTF8 и проблем не будет.

Цитата Сообщение от StoqJets Посмотреть сообщение
Даже выглядит эта софтина круто (свой скрин прилагаю),
Я вижу, что не смотря на скрипт открытый в IDE, вы выполняете его, как запуск ps1-файла. А по моему, в том и удобство IDE, что выделили нужный кусок или сразу всё (ctrl+A) и нажали F8...
0
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
21.03.2019, 10:34  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
Я вижу, что не смотря на скрипт открытый в IDE, вы выполняете его, как запуск ps1-файла. А по моему, в том и удобство IDE, что выделили нужный кусок или сразу всё (ctrl+A) и нажали F8...
Так ведь здесь всё так и происходит как вы написали:
"выделили нужный кусок или сразу всё (ctrl+A) и нажали F8"
Проверил. Работает. Хоть целиком, хоть кусок кода.
Кстати, это круто, что можно кусок кода проверять. Это как же облегчится написание скриптов)))
Раньше создавал отдельные файлы, где и проверял функционал отдельных частей кода. Проверил сейчас, PowerGui оказывается это тоже может. Ну хоть поздно узнал, лучше чем никогда.
Миниатюры
Скрипт для формирования отчётов о НЕ регламентной перезагрузке  
0
 Аватар для KDE777
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
21.03.2019, 10:40
Цитата Сообщение от StoqJets Посмотреть сообщение
Так ведь здесь всё так и происходит как вы написали
Цитата Сообщение от StoqJets Посмотреть сообщение
Раньше создавал отдельные файлы, где и проверял функционал отдельных частей кода.
Я и написал, что глядя на ваш скриншот, вы очень странно используете IDE для запуска скрипта Выполнить выделенное, естественно было в PowerGui и есть в ISE/VSC...
0
0 / 0 / 0
Регистрация: 15.05.2018
Сообщений: 43
21.03.2019, 14:14  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
Используйте Send-MailMessage
Как два пальца. )


Данный код полностью совместим с предыдущим кодом (AnalizCSV.ps1) из моего 30-ого сообщения.
Достаточно заменить блок кода отвечающего за отправку письма в конце скрипта и указать свои реквизиты к почтовому ящику.
Кликните здесь для просмотра всего текста
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Создаём переменную для общего файла-отчёта, для последующей его отправки письмом.
$out2 = "$directory\RebootReportALL.csv"
 
$MailFrom = 'user_name@gmail.com'
$MailtTo = 'user_name@gmail.com'
$MailSubject = "PC name - $env:COMPUTERNAME Отчёт о перезагрузках."
$Attachment = $out, $out2
 
 
$User = 'user_name'
$Password = 'password'
$SmtpServer = 'smtp.gmail.com'
 
# Меняет кодировку на UTF8 иначе вместо русских букв будут знаки вопросов.
$encoding = [System.Text.Encoding]::UTF8
# Отправляем
$Credentials = New-Object System.Management.Automation.PSCredential -ArgumentList $User, $($Password | ConvertTo-SecureString -AsPlainText -Force) 
Send-MailMessage -To "$MailtTo" -from "$MailFrom" -Subject $MailSubject -bodyashtml -body $html_body -SmtpServer $SmtpServer -Encoding $encoding -UseSsl -Credential $Credentials -Attachments $Attachment


Добавлено через 16 минут
KDE777, выявил проблему со скриптом. Формирование отчёта работает не так как задумано.
Покажу на примере.
Кликните здесь для просмотра всего текста

Входные данные (csv-файл):
"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
Отчёт за период с 18.03.2019 по 21.03.2019
 
CompName Monday Tuesday Wednesday Thursday Friday Saturday Sunday
-------- ------ ------- --------- -------- ------ -------- ------
K014          0       1         0        0      0        0      0



После обработки скриптом. За прошлую неделю. Есть проблема. Совмещаются события из прошлой и текущей недели.
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       1         1        0      0        0      0
0
 Аватар для KDE777
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
21.03.2019, 15:09
Цитата Сообщение от StoqJets Посмотреть сообщение
выявил проблему со скриптом
Цитата Сообщение от StoqJets Посмотреть сообщение
После обработки скриптом. За прошлую неделю. Есть проблема. Совмещаются события из прошлой и текущей недели.
Какие же это проблемы? По моему, я всё расписал более чем наглядно... Просто уберите понедельник из этого диапазона:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if ($NowWeek)
{
    # Показать отчёт по текущую дату:
    $ReportEndDate = Get-Date '0:00:00'
    # Показать отчёт от этой даты:
    $ReportStartDate = $date
}
else
{
    # Показать отчёт по текущую дату:
    $ReportEndDate = $date.AddDays(-1)
    # Показать отчёт от этой даты:
    $ReportStartDate = $date.AddDays(-7)
}
Добавлено через 4 минуты
Цитата Сообщение от StoqJets Посмотреть сообщение
Как два пальца. ) Данный код полностью совместим с предыдущим кодом
Смысл ещё раз повторять, что уже было показано в #12,14?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.03.2019, 15:09

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Скрипты 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