Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
1 / 1 / 0
Регистрация: 09.07.2014
Сообщений: 67
1

Фильтрация вечного цикла

06.05.2019, 16:35. Показов 2350. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Возникла задача мониторить лог печати с помощью PS. Написал скрипт который выводит и список когда, кто, где и на каком принтере печатал. Вот только подозреваю, что реализовал я это не так умно как нужно. Боюсь что если скрипт будет долго работать (бесконечный цикл с дозаписью новых событий в массив), то рано или поздно всё это начнёт дико тормозить. Как такие вещи реализуют правильно?

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
# Запрашиваем у лога печати все НАПЕЧАТАННЫЕ документы, код события 307
$xml3=@"
<QueryList>
  <Query Id="0" Path="Microsoft-Windows-PrintService/Operational">
    <Select Path="Microsoft-Windows-PrintService/Operational">*[System[(EventID=307)]]</Select>
  </Query>
</QueryList>
"@
 
 
# Создаём пустой массив
$mass=@()
 
# Выводим ПОСЛЕДНИЕ 10 напечатанных документов и записываем их в массив
$mass+=@(Get-WinEvent -FilterXml $xml3 -MaxEvents 10  | Select-Object TimeCreated,
@{n='User';e={
($_.Message -split ", ",4)[2].Split(" ",4)[2]
}},
@{n='Computer';e={
($_.Message  -split ", ",4)[2].Split(" ",5)[4]
}},
@{n='Printer';e={
($_.Message -split ", ",4)[3].Split(" ",4)[3].Remove(($_.Message -split ", ",4)[3].Split(" ",4)[3].LastIndexOf(" ч"))
}} | sort TimeCreated  )
 
# Выводим с консоль
$mass
 
# Запоминаем длину массива
$counter=$mass.Count
 
# Создаём вечный цикл
for(){
 
# Ждём 3 секунды и снова запрашиваем 10 последних напечатанных документов
start-sleep 3
 
# Записываем в массив только новые события
$mass+=@(Get-WinEvent -FilterXml $xml3 -MaxEvents 10  | Select-Object TimeCreated,
@{n='User';e={
($_.Message -split ", ",4)[2].Split(" ",4)[2]
}},
@{n='Computer';e={
($_.Message  -split ", ",4)[2].Split(" ",5)[4]
}},
@{n='Printer';e={
($_.Message -split ", ",4)[3].Split(" ",4)[3].Remove(($_.Message -split ", ",4)[3].Split(" ",4)[3].LastIndexOf(" ч"))
}} | sort TimeCreated | %{
if ($_.TimeCreated -ge ($mass[$mass.Count-1]).TimeCreated){
    if($_.User -ne ($mass[$mass.Count-1]).user){$_}}
} 
 
)
 
# Выводим только новые значения, чья дата новее последних событий с прошлого раза
$mass[($counter+1)..($mass.Count-1)]
 
# Снова запоминаем длину массива
$counter=$mass.Count
}
Добавлено через 3 минуты
В общём сам спросил сам ответил, всё было просто...

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
# Запрашиваем у лога печати все НАПЕЧАТАННЫЕ документы, код события 307
$xml3=@"
<QueryList>
  <Query Id="0" Path="Microsoft-Windows-PrintService/Operational">
    <Select Path="Microsoft-Windows-PrintService/Operational">*[System[(EventID=307)]]</Select>
  </Query>
</QueryList>
"@
 
 
 
# Выводим ПОСЛЕДНИЕ 10 напечатанных документов (1-ый лог)
$log=Get-WinEvent -FilterXml $xml3 -MaxEvents 10  | Select-Object TimeCreated,
@{n='User';e={
($_.Message -split ", ",4)[2].Split(" ",4)[2]
}},
@{n='Computer';e={
($_.Message  -split ", ",4)[2].Split(" ",5)[4]
}},
@{n='Printer';e={
($_.Message -split ", ",4)[3].Split(" ",4)[3].Remove(($_.Message -split ", ",4)[3].Split(" ",4)[3].LastIndexOf(" ч"))
}} | sort TimeCreated  
 
$log 
 
for(){
 
start-sleep 3
 
# Опять запрашиваем 10 напечатанных документов, выводим только события которые новее событий из 1-го лога
$log2=Get-WinEvent -FilterXml $xml3 -MaxEvents 10  | Select-Object TimeCreated,
@{n='User';e={
($_.Message -split ", ",4)[2].Split(" ",4)[2]
}},
@{n='Computer';e={
($_.Message  -split ", ",4)[2].Split(" ",5)[4]
}},
@{n='Printer';e={
($_.Message -split ", ",4)[3].Split(" ",4)[3].Remove(($_.Message -split ", ",4)[3].Split(" ",4)[3].LastIndexOf(" ч"))
}} | sort TimeCreated | %{
if ($_.TimeCreated -ge ($log[$log.Count-1]).TimeCreated){
    if($_.User -ne ($log[$log.Count-1]).user){$_}}
}
 
# Выводим новые события
$log2  
 
# Обнуляем 1-ый лог
$log=$null
 
# Записываем в него события из 2-го лога
$log=$log2
 
# Обнуляем 2-ой лог
$log2=$null
 
# Поехали по новой!!!!
 
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2019, 16:35
Ответы с готовыми решениями:

Создание независающего вечного цикла
Мне нужно создать в программе вечный цикл. Каким образом это можно сделать, чтоб программа не...

«Организация вечного цикла. Прогон итерации»
Составить алгоритм и программу для вычисления произведения х *х *х *…*х Причем х вводится с...

Как избавиться от вечного цикла в коде?
using System; namespace Laba2_without_parse { class rabota { static void...

есть идея почти вечного двигателя.
кусочек статьи о кондиционерах вывод: затрачивая 1квт мы можем нагревать что-то на 4квта.(при...

1
774 / 423 / 137
Регистрация: 03.06.2009
Сообщений: 1,223
Записей в блоге: 4
06.05.2019, 16:55 2
Лучший ответ Сообщение было отмечено Maret как решение

Решение

Maret, Использование вечного цикла, это моветон.
Лучше посмотреть в сторону подписки на событие журнала.
Подробнее можно почитать вот здесь Привязать задачу к журналу событий Windows

Также сильно напрягают зрение бесконечные сплиты, не проще ли использовать регулярку?
1
06.05.2019, 16:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2019, 16:55
Помогаю со студенческими работами здесь

составить блок-схему алгоритмов для решения задач с использованием трех циклов цикла с постусловием, цикла с предусловием и цикла с параметрами
помогите составить блок-схему алгоритмов для решения задач с использованием трех циклов цикла с...

Ошибка: Нельзя изменять значение переменной цикла внутри этого цикла
при запуске в строке If i=k Then i:=i+1; выдает ошибку &quot;Нельзя изменять значение переменной цикла...

Zc.pas(16) : Параметр цикла for в PascalABC.NET должен описываться в заголовке цикла
program Zc; uses crt; const c=100; var a:array of integer; n,i,k,s:integer; begin clrscr;...

Циклы. Вычисление факториала f=n! описать с помощью цикла с предусловием и цикла с постусловием.
1) Вычисление факториала f=n! описать с помощью цикла с предусловием и цикла с постусловием; ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru