Мой читатель Николай выполнил проверку диска утилитой chkdsk и заинтересовался, где хранятся ее результаты. Мои ответы в письмах не столь подробны, как записи блога. Однако в данном случае исчерпывающий ответ уложился в пару строк текста.
Скопируйте код в буфер обмена:
Get-Winevent -FilterHashTable @{logname="Application"; id="1001"; starttime="01/01/2024"}| ?{$_.providername –match "wininit"} | fl timecreated, message
Нажмите клавишу Win, напечатайте PowerShell и нажмите Enter.
Вы уже поняли, где посмотреть отчет проверки chkdsk?
Разбор команды
Я не случайно упомянул выше «журнал» — отчет о проверке диска хранится в журнале событий (eventvwr.msc). Из него можно легко извлечь данные с помощью PowerShell.
get-winevent –FilterHashTable
получает события с помощью хэш-таблицы фильтра@{logname="Application"; id="1001"; starttime="01/01/2011"} |
фильтрует журнал «Приложения» (Application), извлекая события 1001 с начала 2024 года, и передает результаты дальше (|)?{$_.providername –match "wininit"} |
ищет в полученных результатах события, где в имени поставщика присутствует wininit, и передает результаты дальше (|)fl timecreated, message
– выводит итоговый список, показывая даты и текст событий, соответствующих условиям фильтра>> $env:homedrive$env:homepath\desktop\chkdsk.txt
если добавить этот фрагмент кода в конец команды, ее результаты будут сохранены в текстовый файл на вашем рабочем столе
Конечно, я мог объяснить читателю, как открыть нужный журнал событий и настроить там фильтр по источнику и номеру.
Но одну команду дать и выполнить можно намного быстрее, не правда ли? 16 примеров извлечения сведений из журнала событий вы можете посмотреть командой:
get-help get-winevent -examples
Кто такой поставщик
В Windows есть служба «Журнал событий Windows» (eventlog), которая записывает события в разные журналы. Поставщик WMI (provider) отвечает за сопоставление данных из журналов событий классам WMI (инструментарий управления Windows), работающих под капотом системы. PowerShell отлично справляется с извлечением и обработкой данных WMI, при этом команды получаются очень компактные.
Поставщиком события chkdsk является Microsoft-Windows-Wininit, и на рисунке выше это хорошо видно. Заметьте, что в столбце «Источник» указан просто Wininit, но в подробностях указано полное имя поставщика.
Интересно, что для многих событий можно указать поставщика просто в качестве еще одного фильтра хэш-таблицы, исключая третий шаг команды. Но с Microsoft-Windows-Wininit это не сработало по неведомой мне причине.
Как подсчитать среднее время трех последних загрузок системы
Если вы читали мою книгу об ускорении загрузки, то знаете, о чем я говорю :)
Диагностический пакет содержит набор скриптов PowerShell. И фрагмент одного из них я хочу вам показать, поскольку он напрямую связан с темой сегодняшнего разговора.
Просто скопируйте код и вставьте его в окно консоли PowerShell.
# Получение трех последних событий о загрузке $events = Get-WinEvent -maxevents 3 -FilterHashtable @{logname="Microsoft-Windows-Diagnostics-Performance/Operational"; id=100} # Представление данных каждого события в виде XML $event = [xml]$events[0].ToXml() $event1 = [xml]$events[1].ToXml() $event2 = [xml]$events[2].ToXml() # Извлечение значений BootTime из элемента Data для каждого события # и вычисление среднего времени в секундах $3BootAvg = ` ($([int]$event.SelectSingleNode("//*[@Name='BootTime']")."#text")+` $([int]$event1.SelectSingleNode("//*[@Name='BootTime']")."#text")+` $([int]$event2.SelectSingleNode("//*[@Name='BootTime']")."#text"))/3000 # Вывод на экран округленного значения write-host "Среднее время трех последних загрузок системы (с):" $([int]$3bootAvg)
Результат будет примерно таким:
В PowerShell можно представить данные события в формате XML, а затем извлекать значения из нужных элементов. XML-файл можно увидеть… правильно, в журнале событий.
К этому коду я пришел не без помощи активного «гугления» и Василия Гусева. Для неподготовленного человека код выглядит сложно, но сопоставив комментарии в нем с картинкой журнала событий, вы легко увидите общую идею.
Обратите внимание, что вся операция уложилась в 7 строк кода! Согласитесь, что это весьма компактно.
Если у вас есть примеры небольших скриптов, поделитесь ими в комментариях! Если же для вас это темный лес, рекомендую это вводное видео Василия Гусева.
Положа руку на сердце, я в PowerShell не силен, как и вообще в скриптах. А как у вас обстоят дела?
Результаты голосования утеряны в связи с прекращением работы веб-сервиса опросов.
Сергей
Немного не по теме если можно — давно хотел спросить — применима ли методика описанная здесь в статье а также методика в книге об ускорении загрузки к ОС windows xp?
Vadim Sterkin
Сергей, PowerShell 2.0 для XP можно загрузить отсюда. Я не пользовался PS на XP, поэтому не могу сказать, сработает ли данная команда.
Описанные в книге методики ускорения загрузки не подходят к XP.
equinox
Поправьте, пожалуйста, опечатку, «проверке диске«.
Скриптами Powershell пользуюсь, но, к сожалению, не так часто, как хотел бы — не хватает опыта. И таки да, примеры Василия Гусева помогают.
Пример скрипта, который я использую в работе — регулярная очистка сервера обновлений WSUs от устаревших, замененных и неиспользуемых файлов обновлений, старых редакций обновлений и компьютеров, которые не подключались к WSUS серверу более 30 дней (все это вместо того, чтобы зайти на консоль WSUS — Параметры — Мастер очистки сервера — нажать «Далее», ждать, пока все не очистится… Долго!):
equinox
Еще пример скрипта, может быть полезен админстраторам.
Заведение пользователя посредством скрипта Powershell и csv-файла.
Код Powershell
Код user.csv
Если нужно завести сразу нескольких пользoвателей, такой скрипт выручает очень здорово. Правда, я использую не «чистый» Powershell, а PowerGUI фирмы Quest Software.
Vadim Sterkin
equinox, опечатку исправил. Спасибо за примеры — вижу, что хоть кто-то использует PowerShell в работе :)
PowerGUI активно популяризует MVP Дмитрий Сотников, он работает в Quest. Его видео на TechDays тоже интересны — он отличный докладчик.
Владимир
А попроще, без выпендрежа объяснить можно, я имею ввиду по Русски? То что здесь написано, я ни хрена не понимаю блин! «Откройте Пуск – Поиск – PowerShell» — нет там никакого PowerShell»!
Vadim Sterkin
Владимир, ваш комментарий одобрен только потому, что я решил показать интеграцию консолей Windows. На публикацию следующего комментария в таком тоне можете не рассчитывать.
Теперь по сути запуска PowerShell. Откройте командную строку, введите там powershell и нажмите Enter.
Если у вас это тоже не работает, обратитесь в форум за помощью.
Виталий
Надо добавить пункт «Знаю, но не использую. За ненадобностью.»
А щелчки мышью проще запомнить.
Vadim Sterkin
Виталий, автору вопроса мой ответ в письме понравился. Более того, сегодня он прислал еще одно письмо, поблагодарив за подробный рассказ.
Его реакция сильно отличается от вашей, причем в лучшую сторону. Я уверен, что все сделал правильно.
Андрей
Вадим, спасибо!
Всегда интересно, познавательно и понятно пишите.
Shell
А как лично Вы оценивает скорость работы PowerShell? Ведь не секрет что технология опирается на .NET FrameWork, о котором недавно шла речь в комментариях https://www.outsidethebox.ms/12412/#comment-2522
Все NET-программы, с которыми я работал, были тормозными.
Если скорость не смущает, то ощущения от консольных Нет программах должны быть аналогичными.
Лично я стараюсь выбирать «нейтив» программы, но индустрия идёт к Джаве и ДотНету.
Vadim Sterkin
Андрей, спасибо за поддержку ;)
Shell, я нечасто использую PowerShell, так что мне трудно оценить скорость. Но думаю, надо рассматривать ее в другом контексте.
PS — это средство управления Windows для администраторов. Думаю, что в первую очередь оно призвано ускорить их работу за счет автоматизации рутинных действий.
Многие административные задачи выполняются через графический интерфейс оснасток. Если задача однократная, вряд ли можно ускорить работу, пытаясь наваять скрипт на PS. Но если задача выполняется регулярно, скрипт сэкономит время неимоверно.
Более того, Microsoft создает графические средства управления, заточенные под создание готовых команд. Посмотрите Создание сценариев в среде управления Exchange: ^Справка по Exchange 2010 SP1.
Вы прошли через мастер, и он показывает вам готовую команду. Даже PS изучать особо не надо :)
Therion1966
Извиняюсь за оффтоп…
Уважаемый Вадим! Давно (и всегда с интересом), читаю Ваш блог. Огромное Вам спасибо, что Вы находите время делиться Вашими знаниями с теми, кто до Вашего уровня пока не дотянул! :)
Ну, и со всеми остальными тоже! :)
Vadim Sterkin
Therion1966, спасибо за отклик! Я постараюсь не разочаровать вас в будущем :)
brainstorming
Спасибо, извините за тупость, однако… кхм… у меня не вышло:
Mêlis Farothserkê
Странно, имею 8.1 pro – но нет журналов wininit и chkdsk. А команда powershell для 8 выводит:
Журнал WinLogon вообще пуст, хоть и работает.
Vadim Sterkin
Вариантов ровно два:
1. Проверка диска не выполнялась → выполнить
2. Не функционируют журналы событий → в форум
Moscvich
Здравствуйте Вадим !
Вчера проверял весь жёсткий диск командой chkdsk только прямо в свойствах системного диска. И отчёт я смотрел в журнале Просмотр событий- Приложение по коду 1001 по источнику Wininit Но там весь отчёт по английски написан. Я его ниже копировал в разделе Общие и делал перевод в своём почтовом ящике. И сейчас я делаю проверку раз в три месяца. Спасибо вам !
Леонид Боярский
Здравствуйте, Вадим.
Попробовал применить описанный Вами метод в Windows 10.
Выполнил в PowerShell с правами админа командлет
Get-EventLog -LogName Application -Source chkdsk | select -Last 5 -ExpandProperty Message
В полученном отчете я заметил, что он не соответствует тем дискам которые я проверял последними.
Поскольку в отчете нет даты проверки диска, то догадаться что это не последний отчет практически невозможно и, следовательно, можно придти к неверным выводам о текущем состоянии диска.
Я решил попробовать предлагаемый Вами метод, но с параметром -First 1, т.е. командлет имеет вид
Get-EventLog -LogName Application -Source chkdsk | select -First 1 -ExpandProperty Message
Все сработало и в результате я получил самый последний отчет о работе chkdsk и состоянии проверяемого диска.
Vadim Sterkin
Леонид, вообще, у командлета Select-Object свойства Last и First выводят последние и первые элементы массива. Поэтому -First 1 означает самое старое событие из имеющихся. Если вам надо с датами…. да просто адаптируйте команду для 7 — providername заменить на chkdsk, убрать номер события (он менялся в 8 и 10) и все дела.