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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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.
• Сторонние консольные утилиты можно использовать только в виде готового решения и только в рамках сценариев. Никаких обсуждений и обучений работе с утилитами не предусмотрено и прямо запрещено правилами топика.
Шапка и около-темные вопросы |

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

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT, я Format-List для примера привел. Может другие какие команды есть, ибо без Format-List никаких подробностей не выводится

Всего записей: 3050 | Зарегистр. 24-10-2002 | Отправлено: 13:40 15-02-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Death_INN
 
Через fl * можно посмотреть полный список свойств, потому что без * свойства для показа выбрал за тебя дядя.
Затем через Select-Object сконструировать нужный результат на основе избранных (тобою, а не дядей) свойств.

Всего записей: 17148 | Зарегистр. 14-10-2001 | Отправлено: 14:31 15-02-2019 | Исправлено: LevT, 14:34 15-02-2019
Death_INN

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

Код:
Id:  100
..
TimeCreated:  06.02.2019 9:54:11
..
LevelDisplayName:  Предупреждение
..
Message:   Windows запущена:
                            Длительность загрузки:  20865ms
                            IsDegradation:  false
                            Время события (UTC):  &#8206;2019&#8206;-&#8206;02&#8206;-&#8206;05T15:44:15

 
Как вычленить 20865ms?

Всего записей: 3050 | Зарегистр. 24-10-2002 | Отправлено: 15:50 15-02-2019 | Исправлено: Death_INN, 15:50 15-02-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Death_INN
 
| Select[-Object] -Exp[andProperty] Message
или
(<..>).Message
 
Добавлено:
 
Только там может быть тоже сложный объект, и так же надо лезть вовнутрь через fl * или Get-Member

Всего записей: 17148 | Зарегистр. 14-10-2001 | Отправлено: 15:57 15-02-2019 | Исправлено: LevT, 18:03 15-02-2019
iNNOKENTIY21



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

Цитата:
Get-WinEvent -Path 'C:\Windows\System32\Winevt\Logs\Microsoft-Windows-Diagnostics-Performance%4Operational.evtx' | Where-Object {$_.ID -eq "100"}

Есть такая функция

Всего записей: 3519 | Зарегистр. 16-08-2012 | Отправлено: 21:16 15-02-2019
Death_INN

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21, сохранил функцию без примеров в скрипт, запускаю от имени админа, затем ввожу Get-BootTimeStatistics -counts 20 | select BootStartTime, BootEndTime, BootTime или просто Get-BootTimeStatistics, а мне выдает:
 
Командлет Add-Member в конвейере команд в позиции 1
Укажите значения для следующих параметров:
TypeName:
 
И ждет ввода какого-то

Всего записей: 3050 | Зарегистр. 24-10-2002 | Отправлено: 22:20 15-02-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Death_INN
Так что там внутри Message на самом деле?
 
Тот полуструктурированный текст, что процитирован сверху - плод деятельности повершельного автоформатирования, и предназначен только для визуальной оценки.
Среди прочего показана выдача Message | Format-String
Совершенно естественно желание добраться до первоисточника данных, и повершел в помощь.

Всего записей: 17148 | Зарегистр. 14-10-2001 | Отправлено: 22:40 15-02-2019 | Исправлено: LevT, 22:44 15-02-2019
iNNOKENTIY21



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

Цитата:
запускаю от имени админа

Надо импортировать, скрипт/модуль тут не роляет, у меня типа модуль
Код:
Import-Module Get-BootTimeStatistics.psm1

На всякий там случай с кодировками и т.д. сам файл: Get-BootTimeStatistics.psm1

Всего записей: 3519 | Зарегистр. 16-08-2012 | Отправлено: 22:47 15-02-2019
Death_INN

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21, пытаюсь автоматизировать процесс, но не получается. Создал скрипт proba.ps1. Его содержимое:
---------------------
Import-Module "C:\Portable\Scripts\Get-BootTimeStatistics.psm1"
 
Get-BootTimeStatistics | Measure-Object -Property BootTime -Average | Select-Object @{n = "Загрузок"; e = {$_.Count}}, @{n = "Среднее время"; e = {"{0} секунд" -f [int]($_.Average / 1000)}}
 
Get-BootTimeStatistics -counts 3 | select BootStartTime, MainPathBootTime, BootPostBootTime, BootTime
 
Sleep 3
---------------------
Sleep чисто для теста. Скрипт запускаю через ярлык. Только первый из Get-BootTimeStatistics выполняется, а второй нет, а Sleep выполняется раньше, чем Get-BootTimeStatistics.
 
Что за петрушка?

Всего записей: 3050 | Зарегистр. 24-10-2002 | Отправлено: 01:46 16-02-2019
iNNOKENTIY21



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

Цитата:
Что за петрушка?  

Забавно. PowerShell излишне умничает, пытается свести в одну таблицу обе команды.
Заменить select на ft или в первой команде на fl
 

Код:

Import-Module "C:\Portable\Scripts\Get-BootTimeStatistics.psm1"
 
Get-BootTimeStatistics |
 Measure-Object -Property BootTime -Average |
  Format-List @{n = "Загрузок"; e = {$_.Count}}, @{n = "Среднее время"; e = {"{0} секунд" -f [int]($_.Average / 1000)}}
 
Get-BootTimeStatistics -counts 3 |
 Format-Table -AutoSize BootStartTime, MainPathBootTime, BootPostBootTime, BootTime
 
Sleep 3

Всего записей: 3519 | Зарегистр. 16-08-2012 | Отправлено: 08:52 16-02-2019
Death_INN

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21, отлично, благодарю. Можно было, конечно, не создавать отдельный скрипт, если вручную команды вводить, а просто создать ярлык на Get-BootTimeStatistics.psm1, а в поле Объект прописать:
powershell.exe /nologo /noexit /command Import-Module "путь к\Get-BootTimeStatistics.psm1"

Всего записей: 3050 | Зарегистр. 24-10-2002 | Отправлено: 10:24 16-02-2019 | Исправлено: Death_INN, 10:28 16-02-2019
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Death_INN
Чтобы модуль загружался автоматически, надо его поместить по пути указанной в переменной PSModulePath.
 
Поскольку функция требует повышенных прав, то PowerShell запускаем от админа и вводим: $env:PSModulePath.split(';')
Находим строку с папкой админа Documents\WindowsPowerShell\Modules, создаём папку с именем как у модуля, т.е. BootTimeStatistics\BootTimeStatistics.psm1 (такое имя лучше для файла модуля).
Получается, что то типа: C:\Users\<Admin>\Documents\WindowsPowerShell\Modules\BootTimeStatistics\BootTimeStatistics.psm1
Перезапуск PowerShell от админа и можно вызывать нашу функцию из модуля:  
"Время загрузки: $((Get-BootTimeStatistics -counts 1).BootTime / 1000) секунд"
 
С другими модулями (не требующих повышенных прав) поступаем так же, только уже не в папку админа, а в свою. Если сидите под админом, то это одна и та же учетка/папка.
Я так складываю небольшие функции в один файл/модуль Helpers\Helpers.psm1
Как то так
 
Добавлено:
В модуле может быть не одна функция.
Можно добавить код, используемый в качестве примера, в модуль в виде функции:

Код:
function Get-BootTimeAverage
{
    param
    (
        # Количество последних загрузок системы, не менее: 1, по умолчанию: 5
        [ValidateRange(1, [int16]::MaxValue)][int]$counts = 10
    )
 
    Get-BootTimeStatistics -counts $counts |
     Measure-Object -Property BootTime -Average |
      Select-Object @{n = "Загрузок"; e = {$_.Count}},
        @{n = "Среднее время"; e = {"{0} секунд" -f [int]($_.Average / 1000)}}
}

И запускать уже не только Get-BootTimeStatistics, но и Get-BootTimeAverage
Без всяких импортов

Всего записей: 3519 | Зарегистр. 16-08-2012 | Отправлено: 12:24 16-02-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21
 
Чем сильнее интегрируется самописный модуль, тем больше неудобств от его неконвенционального названия (имею в виду путаницу с командлетами)
Назовите модуль BootTimeStatistics или BootTimings: котики останутся жить, карма облегчится и аура высветлится.


Всего записей: 17148 | Зарегистр. 14-10-2001 | Отправлено: 13:01 16-02-2019 | Исправлено: LevT, 13:02 16-02-2019
iNNOKENTIY21



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

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

как бы

Цитата:
BootTimeStatistics\BootTimeStatistics.psm1 (такое имя лучше для файла модуля).  

 

Всего записей: 3519 | Зарегистр. 16-08-2012 | Отправлено: 13:29 16-02-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21
Звиняюсь, не заметил.
 
Как всегда, докину чуть экзорцизма
в смысле почищу от лишних циклов, ручных массивов и объектов-аккумуляторов
 

Код:

filter Get-EventData {
    $xmlEventData = ([xml]$_).Event.EventData.Data
    $xmlEventData | Select Name,@{N='Value';E={$_.'#text'}}  
}
 
 
function Select-EventData
{
    [CmdletBinding()]
    param (
        # Имя журнала событий системы
        $logname = "Microsoft-Windows-Diagnostics-Performance/Operational",
        # Идентификатор события
        $id = 100,
        # Количество последних событий, по умолчанию: 5
        [ValidateRange(1, [int16]::MaxValue)][int]$counts = 5
    )
 
    # Отфильтрованные события
    $events = Get-WinEvent -maxevents $counts -FilterHashtable @{
        logname = $logname
        id      = $id
    }
 
    $xmlEvents = $events.ToXml()
 
    $xmlEvents | Get-EventData
}

-почти получилась вполне себе общая утилита для вытаскивания данных из логов
 
Но использовать выдачу придётся по-другому, то есть измерять другой объект:
(Select-EventData).Where{$_.Name -eq 'BootTime'}.Value  
 
А всё потому, что у меня не выходит из Get-EventData добыть [PSCustomObject]:
 
> (Select-EventData) | Get-Member
TypeName: Selected.System.Xml.XmlElement
 
Помогите побороть нежданчик!
 
 
Добавлено:
Ответ где-то рядом...
 

Всего записей: 17148 | Зарегистр. 14-10-2001 | Отправлено: 15:14 16-02-2019 | Исправлено: LevT, 18:08 16-02-2019
iNNOKENTIY21



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

Цитата:
Ответ где-то рядом...  


Код:
$str = @("Цикл", "Массив"); foreach ($item in $str) {"$item мертв!`nДа здравствует $item!!!`n"}


 
Добавлено:
Или так:
Код:
"Цикл", "Массив" | % {"$_ мертв!`nДа здравствует $_!!!`n"}


Всего записей: 3519 | Зарегистр. 16-08-2012 | Отправлено: 23:16 16-02-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21
 
Циклы и массивы встроены в движок и чаще всего в явном виде вредны: код без них короче и выразительней.
Но чтобы в полной мере этим пользоваться, надо уверенно владеть преобразованиями типов коллекций.
И вот тут я как раз столкнулся с нежданчиком, и прошу помощи: подогнать выдачу Get-EventData под ваш контракт использования:
 
 Select-EventData -Counts 5 | Measure-Object -Property BootTime -Average
 
В нынешнем виде у меня при агрегировании свойств избранных событий все свойства сваливаются в кучу т.е. теряется инфа об их происхождении (событие - "корзина свойств", иначе говоря теряется инфа о том, какие ещё свойства лежали в той же корзине).
Она только для статистики не нужна, а вообще-то нужна, конечно.

Всего записей: 17148 | Зарегистр. 14-10-2001 | Отправлено: 10:51 17-02-2019 | Исправлено: LevT, 11:24 17-02-2019
Death_INN

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Get-BootTimeStatistics -counts 20 | Select-Object BootStartTime, MainPathBootTime, BootPostBootTime, BootTime
 
У BootStartTime можно как-то обрезать 2019-02-10T06:33:17.668253900Z?

Всего записей: 3050 | Зарегистр. 24-10-2002 | Отправлено: 11:04 17-02-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Death_INN
Вроде тут хорошо объяснено
 
 
Добавлено:
iNNOKENTIY21
 
 Вот так вся инфа сохраняется:
 
filter Get-EventData {
    [PSCustomObject]@{
        'DotNetHash' = $_.GetHashCode();
        'EventData' = ([xml]$_).Event.EventData.Data
    }
}
 
1) Вопрос к знатокам дотнета.  
Насколько безопасно и осмысленно сохранять вот такой искусственный ключ  'DotNetHash' = $_.GetHashCode();   ?
УПД. Смысла в данном случае не видно: коллекция "корзин" остаётся таковой и без ключа, можно перечислять как корзины, так и элементы внутри каждой их них.  
 
2) по-прежнему не работает
(Select-EventData).EventData | Measure-Object -Property BootTime -Average
 
видимо из-за того что  
PS> (Select-EventData)[0].EventData | Get-Member
   TypeName: System.Xml.XmlElement#http://schemas.microsoft.com/win/2004/08/events/event#Data

Всего записей: 17148 | Зарегистр. 14-10-2001 | Отправлено: 11:27 17-02-2019 | Исправлено: LevT, 12:32 17-02-2019
LevT



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

Код:
 
# конвертирует в хэштаблицу плоское содержимое XML узла Event.EventData.Data
function XmlToHashtable ($xmldata){
    $hashtable = @{}
    $xmldata | foreach-object {
        $hashtable.Add($_.Name, $_.'#text')
    }  
    $hashtable
}
 
# отображает коллекцию элементов XML в хэштаблицу и дальше в родной объект повершел (который можно измерять и селектить)
filter Get-EventData {  
    [PSCUstomObject](XmlToHashtable (([xml]$_).Event.EventData.Data))  
}  
 
 
function Select-EventData
{
    [CmdletBinding()]
    param (
        # Имя журнала событий системы
        $logname = "Microsoft-Windows-Diagnostics-Performance/Operational",
        # Идентификатор события
        $id = 100,
        # Количество последних событий, по умолчанию: 5
        [ValidateRange(1, [int16]::MaxValue)][int]$counts = 5
    )
 
    # Отфильтрованные события
    $events = Get-WinEvent -maxevents $counts -FilterHashtable @{
        logname = $logname
        id      = $id
    }
 
    $events.ToXml() | Get-EventData
}
 

 
 
Примеры соответствия вышепользованному контракту:
Подробнее...
 
Самая первая функция XmlToHachtable мне, тем не менее, не нравится.
В принципе, можно сюда притащить больше XML и XPath...  (копнуть Select-Xml)
   но должен же быть и труE повершел way

Всего записей: 17148 | Зарегистр. 14-10-2001 | Отправлено: 17:45 17-02-2019 | Исправлено: LevT, 18:21 17-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