Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Сценарии для Windows

Модерирует : KLASS, IFkO

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225

Открыть новую тему     Написать ответ в эту тему

KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Старые и смежные темы: по CMD и в Программах | по PowerShell | В помощь системному администратору | Прикладное программирование

PowerShell
Версии | Ассоциация и подпись сценариев
Сценарий для ассоциации файлов PowerShell и запуска неподписанных скриптов.
 
Прочее
Расширение возможностей
Функции
Write-Color
Output-DebugString
Провайдеры
Готовые скрипты
Полезные ссылки | Будет ли репозиторий PowerShell на ru-board?
Книги в PDF
Cheat Sheets
 

Cmd
Для перекодирования кириллицы 866<—>1251 пользуйтесь онлайн сервисом Перекодировщик кириллицы
 
Готовые решения и частые вопросы
 
Описания работы команд и символов участниками темы:
setlocal enabledelayedexpansion и переменные окружения
символы & и && в командной строке
Переменная %0
 
Полезные ссылки и утилиты

WSH (VBScript, JScript)
Программирование "удобняшек" на VBScript

Примечания:
• Большие куски кода заключайте в тэг [ more ]
• Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте код без пробелов иначе сценарий может работать неправильно. Также для удаления концевых пробелов пользуйтесь скриптом от Nagual, или VBS-Скрипт-Модулем от ViSiToR.
• Сторонние консольные утилиты можно использовать только в виде готового решения и только в рамках сценариев. Никаких обсуждений и обучений работе с утилитами не предусмотрено и прямо запрещено правилами топика.
Шапка и около-темные вопросы |

Всего записей: 11062 | Зарегистр. 12-10-2001 | Отправлено: 13:40 17-02-2018 | Исправлено: YuS 2, 08:24 19-06-2021
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Попытка сляпать универсальный параметризированный скрипт для создания выборки по логам:

Код:
#requires -v 5.0
#requires -runas
# Все значения, заданные в параметрах, приведены для примера, их лучше удалить и задавать в параметрах скрипта
# Пример использования:
# .\script.ps1 'Microsoft-Windows-Diagnostics-Performance/Operational' '^(boottime|start|bootstart|bootend)' -max 50 -eventid 100,103
 
[cmdletbinding()]
param (
    [parameter(Mandatory=$true)]
    [string]$logname = "Microsoft-Windows-Diagnostics-Performance/Operational", # Наименование  лога с путем
    [string]$arguments = '.', # Шаблон для отбора элементов из узла EventData  
    [int]$maxevents, #= 40, # Число событий для отчета
    [int[]]$level, #= (0,3), # Уровни для отбора событий
    [int[]]$eventid #= (100,103) # ID событий для отбора
)
 
# Формируем строку фильтра
if ($level){
    for ($k=0;$k -lt $level.count;$k++){
        [array]$arr1 += "Level=$($level[$k])"
    }
    $levels = '('+$($arr1 -join ' or ')+')'
}
if ($eventid){
    for ($n=0;$n -lt $eventid.count;$n++){
        [array]$arr2 += "EventID=$($eventid[$n])"
    }
    $eventids = '('+$($arr2 -join ' or ')+')'
}
if (!$eventids -and !$levels){$flt = "*"} elseif ($eventids -and $levels) {
    $flt = "*[System[$eventids and $levels]]"
} elseif (!$levels) {$flt = "*[System[$eventids]]"} else {$flt = "*[System[$levels]]"}
 
# Проверяем результат
#$eventids
#$levels
#$flt
 
# Отбираем события, формируем массив объектов
$events = get-winevent -log $logname -filterxp $flt -max $maxevents
[xml[]]$xml = $events.toxml()
$out = for ($i=0;$i -lt $xml.count;$i++){
    select-xml -xml $xml[$i] -xpath "//ns:EventData" -namesp @{
        ns = $xml[$i].documentelement.namespaceuri
    } |?{$_.node.data.name -match $arguments}|%{
        select -inputobject $_.node -prop @{
            n='TimeCreated';e={(get-date $_.parentnode.system.timecreated.systemtime)}
        },@{
            n='EventID';e={$_.parentnode.system.eventid}
        },@{
            n='Level';e={$_.parentnode.system.level}
        },@{
            n='Data';e={$_.data|? name -match $arguments}
        } |select -prop timecreated,eventid,level -exp data
    }
}
# Результат
$out|sort eventid,timecreated,level|select timecreated,eventid,level,name,@{
    n='Data';e={
        if([datetime]::tryparse(($_.'#text'),[ref](new-object datetime))){(get-date $_.'#text')}else{$_.'#text'}
    }
} #|ft -auto -wrap


Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 18:19 17-02-2019 | Исправлено: YuS_2, 21:37 17-02-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
 
По-моему, у тебя потерялись "корзины" свойств, относящихся к одному событию.
Не вижу другого способа их увидеть, кроме как сгруппировать выдачу по TimeCreated
Практически оно сойдёт, но фэншуй протестуе..
 
 
Добавлено:
И ещё.
Предположение о том, что в Data пишется всегда атомарное значение (имеющее тот или иной простой тип) - оно очень сильное.
Хорошо если так, но вдруг бывают исключения?

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 18:49 17-02-2019 | Исправлено: LevT, 18:59 17-02-2019
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Рабочий код от LevT и без нравоучений

Код:

$iNNOKENTIY21 = (Measure-Command -Expression {$n = 0 ; while ($n -lt 100) {Get-BootTimeStatistics -counts 10 | measure -Property boottime -Average ; $n++}}).TotalMilliseconds
$LevT = (Measure-Command -Expression {$n = 0 ;while ($n -lt 100) {Select-EventData -counts 10 | measure -Property boottime -Average; $n++}}).TotalMilliseconds
"iNNOKENTIY21 `t- $iNNOKENTIY21" ; "LevT `t`t- $LevT"

Красота

Всего записей: 3504 | Зарегистр. 16-08-2012 | Отправлено: 19:08 17-02-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT

Цитата:
у тебя потерялись "корзины" свойств

а по-моему у тебя потерялся перечень приемлемых терминов
Другими словами: моя твоя не понимает...
 

Цитата:
но фэншуй протестуе

можешь даже на пару с ним петицию в ООН накатать
 

Цитата:
Предположение о том, что в Data пишется всегда атомарное значение (имеющее тот или иной простой тип) - оно очень сильное.

чего-чего? ты о чем?

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 19:10 17-02-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
1) все термины заняты ))
Короче, коллекцию свойств которые относятся к одному событию хорошо бы где-то запомнить - чтобы при анализе выдачи можно было связать разные свойства одного и того же события.
 
2) Ты очень уверенно опираешься на определённый паттерн в #text
Уверен, что нигде ни в одном логе/событии в Data не пишется вольный текст?
 
 
 
iNNOKENTIY21
 
Только благодаря коду от iNNOKENTIY21, который у меня зазаудело улучшить  


Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 19:15 17-02-2019 | Исправлено: LevT, 19:22 17-02-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT

Цитата:
все термины заняты

а ты велосипеды перестань изобретать и откроешь для себя чудный мир с присутствующим уже перечнем терминов.
 

Цитата:
Короче, коллекцию свойств которые относятся к одному событию хорошо бы где-то запомнить

Ну а $events для чего дадено? или $xml, в частности...
 

Цитата:
Ты очень уверенно опираешься на определённый паттерн в #text

А ты уверен, что это паттерн?
 

Цитата:
Уверен, что нигде ни в одном логе/событии в Data не пишется вольный текст?

Скажу даже больше: скорее, уверен, что он там есть. А вот в чем ты нашел проблему - не понимаю... серьезно.
 
Добавлено:
LevT

Цитата:
паттерн в #text

Для тренировки:
Море-море, ты безбрежно

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 19:58 17-02-2019 | Исправлено: YuS_2, 20:20 17-02-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
 
Вроде бы, ты тоже нацелился обобщить скрипт для любых логов?
Как я чуть раньше.
 
 
Добавлено:
В этом логе вот такие вот свойства внутри Data, а в других - может быть что угодно или почти.
(Пока не доказано обратное)

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 20:35 17-02-2019 | Исправлено: LevT, 20:40 17-02-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT

Цитата:
Вроде бы, ты тоже нацелился обобщить скрипт для любых логов?

Допустим.
 

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

И? Перестань говорить загадками. Сформулируй суть моей ошибки или хотя бы код процитируй, который тебе кажется неверным, а там уже будет видно: то ли я ошибся, если аргумент будет достаточно обоснованным, либо определим, что ошибаешься ты. Всё просто. А ребусы разгадывать не хочется...

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 20:51 17-02-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
 
Ты исходишь из предположения, что если текст проперти похож на дату - туда записана именно дата (Datetime), и при конвертации в тот тип ничего не потеряется.
Я не утверждаю, что оно неверно, но сомнению подвергаю.
 
Может кому-то вздуматься навалять в лог CSV из дат, например?
Такое в природе встречается?

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 21:01 17-02-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT

Цитата:
если текст проперти похож на дату - туда записана именно дата (Datetime), и при конвертации в тот тип ничего не потеряется.

Ты об этом, что ли:

Код:
if($_.'#text' -match '\d{2,4}.\d{2}.\d{2}T'){(get-date $_.'#text')}else{$_.'#text'}

?
Это верно, согласен, что шаблон не универсален... родился он на коленке после прочтения этого:
 17-02-2019

Цитата:
У BootStartTime можно как-то обрезать 2019-02-10T06:33:17.668253900Z?

Но во-первых, шаблон применяется к уже сформированному массиву выходных данных, т.е. его безболезненно можно выпилить, а во-вторых, его можно допилить/уточнить, если такая необходимость возникнет (то бишь, чтобы свести к минимуму количество ложных совпадений).

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 21:12 17-02-2019 | Исправлено: YuS_2, 21:13 17-02-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну, и если конструировать даты на основе #text - то почему забыты остальные типы данных?
При наличии рвения можно одним и тем же скриптом закачать всё в структурированную СУБД.
Только не нужно: скрипту достаточно хорошо делать одну вещь.
 
А Death_INN показать ответ на его вопрос, чтобы он научился использовать твой и другие инструменты сам.

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 21:14 17-02-2019 | Исправлено: LevT, 21:16 17-02-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT

Цитата:
Ну, и если конструировать даты на основе #text - то почему забыты остальные типы данных?

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

Цитата:
показать ответ на его вопрос, чтобы он научился использовать твой и другие инструменты сам.

Вывел уточненный шаблон в отдельную строку с комментарием. Если что-то непонятно - задавайте вопросы.
Нет, лучше уж так, чтобы сомнения отпали:

Код:
[datetime]::tryparse(($_.'#text'),[ref](new-object datetime))


В общем, поправлено...

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 21:25 17-02-2019 | Исправлено: YuS_2, 21:42 17-02-2019
Death_INN

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2

Цитата:
[datetime]::tryparse(($_.'#text'),[ref](new-object datetime))

Надеюсь, что проверка не понадобится, так что обойдусь без нее)
 
Get-BootTimeStatistics -counts 2 | Select-Object @{n="Date       Time"; e={Get-Date $_.BootStartTime}}, BootTime, MainPathBootTime, BootPostBootTime
 

Всего записей: 3025 | Зарегистр. 24-10-2002 | Отправлено: 01:35 18-02-2019 | Исправлено: Death_INN, 01:44 18-02-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
 
Извини, твой скрипт у меня тоже зудит )
 

Код:

#верхние две функции теперь можно повторно использовать в других скриптах
 
filter withprefix ($prefix) {
    "{0}{1}" -f $prefix,"$_"
}
 
function embrace_withprefix ($prefix,$var){
    '('+ (($var | withprefix $prefix)  -join ' or ') + ')'
}
 
$levels = embrace_withprefix 'Level=' $level
$eventids = embrace_withprefix 'EventID=' $eventid
 
$flt = "*"
if ($levels -or $eventids) {
    $flt = '*[System[' + (($levels,$eventids) -join ' and ') + ']]'
}
 
# Проверяем результат  
#$eventids  
#$levels  
#$flt  

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 11:29 18-02-2019 | Исправлено: LevT, 00:13 19-02-2019
Tiikker



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT, да смотрел именно им, уважаю этого человека за его труд, не нашёл ничего.. Иначе бы давно этой гадости руки и зубы повырывал бы... ) До родов ещё.. ) Но при старте венды Темп чистый, потом они откудато в непонятное время появляются. Когда я чемнить занимаюсь на компе и не могу в реалтайме отследить этот "вброс".. Тем более, на компе у меня нет сабжей с таким именем, не говоря уж про детскую забаву с различными инсталляторами, напичканными гавном, которое садится как можно глубже при старте.. Я им все тропы перекрыл )

Всего записей: 956 | Зарегистр. 05-06-2018 | Отправлено: 11:31 18-02-2019 | Исправлено: Tiikker, 11:38 18-02-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Tiikker
Ну дык отфильтруй в настройках всё кроме местоположения Temp, оставь мониторилку работать и взгляни потом когда о ней вспомнишь.
 

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 11:38 18-02-2019
Tiikker



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT, хмм.. вариант.. Спасипки...

Всего записей: 956 | Зарегистр. 05-06-2018 | Отправлено: 11:39 18-02-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT

Цитата:
у меня тоже зудит

Когда зудит, надо на это обратить внимание шутка
 
Сходу не совсем понял, вечерком, в спокойной обстановке гляну...  
Но, кстати, скрипт мой немного не то выводит, что требовалось,судя по скрину отсюда:  18-02-2019
т.е. переделывать надо. Освобожусь - попробую перековырять... хотя уже из головы вылетело, чего я там мудрил.
 
Добавлено:
LevT  18-02-2019

Цитата:
твой скрипт у меня тоже зудит

Нет, фильтр составляется неверно, если не выбран один или сразу оба аргумента (EventID или Levels), если же присутствуют оба, то фильтр работает.
 
Добавлено:
Вот, перелопаченный скрипт:

Код:
# Идея: https://blogs.technet.microsoft.com/ashleymcglone/2013/08/28/powershell-get-winevent-xml-madness-getting-details-from-event-logs/
# Version 2.0.1.005
# Date 27.02.2019
#requires -v 5.0
#requires -runas
# Все значения, заданные в параметрах, приведены для примера, их лучше удалить и задавать в параметрах скрипта
# Примеры использования:
# .\script.ps1 -logname 'Microsoft-Windows-Diagnostics-Performance/Operational' -arg '^(boottime|start|bootstart|bootend)' -max 50 -eventid 100,103 -data
# .\script.ps1 -logname 'Microsoft-Windows-Diagnostics-Performance/Operational' -arg '^(boottime|start|bootstart|bootend)' -max 50 -eventid 100 -data|ft
# .\script.ps1 -logname 'Microsoft-Windows-Diagnostics-Performance/Operational' -arg '.' -max 50 -eventid 100,103 -data|out-gridview
# .\script.ps1 -listl '*'|out-gridview
# .\script.ps1 -listl '*intel*'
<#
Level
0 - всегда записывать;
1 - Критический;
2 - Ошибка;
3 - Предупреждение;
4 - Сведения;
5 - Подробности (Verbose).
#>
 
[cmdletbinding()]
param (
    [string]$computername, # Имя компьютера с которого получаем данные журналов
    $credential, # Ввод учетных данных
    [string[]]$logname, #= "Microsoft-Windows-Diagnostics-Performance/Operational", # Наименование лога (пути с именем журнала)
    [string[]]$listlog, # Получение списка указанных журналов событий, все журналы - *
    [string[]]$listprovider, # Получение списка указанных поставщиков
    [int64]$maxevents, #= 30, # Число событий для отчета
    [switch]$force, #  Дополнительное получение аналитических и отладочных журналов, если используются символы подстановки
    [switch]$oldest, # Формирование списка от наиболее старого к новому
    [string[]]$path, # Путь к указанным файлам логов, поддерживаются .evt, .evtx, .etl расширения
    [string[]]$providername, # Получение событий, записанных указанными поставщиками (поддерживаются подстановочные знаки)
    [string]$arguments = '.', #'^(boottime|start|bootstart|bootend)', # Шаблон для отбора элементов из узлов EventData
    [int[]]$level, #= (4), # Уровни для отбора событий
    [int[]]$eventid, #= (100,103,108) # ID событий для отбора
    [switch]$data #= $true # Переключатель для получения дополнительных данных из узлов Data в отобранных событиях
)
 
# Формируем простой фильтр XPath, если указаны $level или $eventid
function map_prefix ($prefix, $var){
    if ($var){
        '('+ (($var|%{"{0}{1}" -f $prefix,"$_"}) -join ' or ') + ')'
    }
}
 
$levels = map_prefix 'Level=' $level
$eventids = map_prefix 'EventID=' $eventid
 
$arr = $eventids,$levels
if ($arr -ne $null) {$flt = "*[System[$(($arr -ne $null) -join ' and ')]]"}
 
# Формируем строку параметров командлета
$pars = @{}
if($computername){$pars.computername="$computername"}
if($logname){$pars.logname="$logname"}
if($computername -and $credential){$pars.credential = Get-Credential -cred $credential}
if($listlog){$pars.listlog=$listlog}
if($listprovider){$pars.listprovider=$listprovider}
if($maxevents){$pars.maxevents=$maxevents}
if($oldest){$pars.oldest=$true}
if($force){$pars.force=$true}
if($path){$pars.path=$path}
if($providername){$pars.providername=$providername}
if($flt){$pars.filterxpath="$flt"}
 
if ($data){
    # Получаем результат работы командлета  
    $events = get-winevent @pars
    # Фильтр элементов в событиях по шаблону
    $elname = ([xml[]]$events.toxml()).event.eventdata.data.name
    $sel = if (($a = $elname -match $arguments) -eq $true){$elname} else {$a|sort -uni}
    
    $z=-1
    # Добавляем свойства к объектам
    foreach ($event in $events){
        $xml = [xml]$event.toxml()
        if ($xml.event.eventdata.data.count){
            for ($i=0;$i -lt $xml.event.eventdata.data.count;$i++){
                if($xml.event.eventdata.data[$i].name){
                    $name = $xml.event.eventdata.data[$i].name
                    $val = $xml.event.eventdata.data[$i].'#text'
                } else {
                    $name = 'Data' + "$i"
                    if ($i -gt $z) {[array]$darr += $name;$z = $i}
                    $val = $xml.event.eventdata.data[$i]
                }
                $val = if([datetime]::tryparse($val,[ref](get-date))){get-date $val} else {$val}
                add-member -inp $event -mem noteproperty -force -name $name -val $val
            }
        }
    }
 
    # Формируем строку отбираемых свойств
    $head = 'timecreated','id','level','leveldisplayname'
    if($darr){
        # Фильтруем созданные свойства DataN, у которых не было аргументов
        $fdarr = if(($b = $darr -match $arguments) -eq $true){$darr} else {$b}
        if ($sel){
            $sel = $head + $fdarr + $sel + '*'
        } else {$sel = $head + $fdarr + '*' }
    } elseif ($sel) {
        $sel = $head + $sel + '*'
    } else {$sel = $head + '*'}
    
    # Выводим результат
    $obj = try {$events|select $sel -ea 0} catch {continue}
    $obj|select *
} else {
    get-winevent @pars
}

 
Отбор параметров происходит по шаблону $arguments, с регулярными выражениями.
Вывод скрипта можно откорректировать до полного вывода всех свойств (в последней строке).
Выводит все доступные командлету get-winevent свойства событий, плюс дополнительно отобранные по шаблону значения узлов Data (именованных и не именованных тоже)
 
Добавлено:  
история

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 15:10 19-02-2019 | Исправлено: YuS_2, 09:36 30-01-2020
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
 
Поправил сборку запроса
 

Код:

#верхние две функции теперь можно повторно использовать в других скриптах
 
function map_prefix ($prefix, $var){
    #if ($var.count -eq 0){break}
    $var | foreach {"{0}{1}" -f $prefix,"$_"}
}
 
function embrace_map_prefix ($prefix, $var){
    if ($var.count -eq 0){break}  
    '('+ ((map_prefix $prefix $var)  -join ' or ') + ')'  
}  
 
$levels = embrace_map_prefix 'Level=' $level
$eventids = embrace_map_prefix 'EventID=' $eventid
 
$flt = "*"
if ($levels -or $eventids) {
    $flt = '*[System[' + (($levels,$eventids) -join ' and ') + ']]'
}
 
# Проверяем результат  
#$eventids  
#$levels  
#$flt  


Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 18:21 19-02-2019 | Исправлено: LevT, 18:26 19-02-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT

Цитата:
Поправил сборку запроса

теперь при отсутствии одного из параметров, фильтр совсем не работает, т.е. вообще никакого нет, в том числе и $flt = "*", поэтому будет вываливаться ошибка...
 
 
Добавлено:
LevT
Вот скрипт для проверки:

Код:
[cmdletbinding()]
param (
    [int[]]$level , #= (0,3), # Уровни для отбора событий
    [int[]]$eventid #= (100,103) # ID событий для отбора
)
#верхние две функции теперь можно повторно использовать в других скриптах
 
function map_prefix ($prefix, $var){
    #if ($var.count -eq 0){break}
    $var | foreach {"{0}{1}" -f $prefix,"$_"}
}
 
function embrace_map_prefix ($prefix, $var){
    if ($var.count -eq 0){break}
    '('+ ((map_prefix $prefix $var)  -join ' or ') + ')'
}
 
$levels = embrace_map_prefix 'Level=' $level
$eventids = embrace_map_prefix 'EventID=' $eventid
 
$flt = "*"
if ($levels -or $eventids) {
    $flt = '*[System[' + (($levels,$eventids) -join ' and ') + ']]'
}
 
# Проверяем результат
$eventids
$levels
$flt

 
Строка запуска:

Код:
.\filt.ps1 -lev 0,1,3 -even 100,103

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 18:53 19-02-2019
Открыть новую тему     Написать ответ в эту тему

Страницы: 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 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225

Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Сценарии для Windows


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru