Мой читатель Николай выполнил проверку диска утилитой 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?
Сергей, PowerShell 2.0 для XP можно загрузить отсюда. Я не пользовался PS на XP, поэтому не могу сказать, сработает ли данная команда.
Описанные в книге методики ускорения загрузки не подходят к XP.
Поправьте, пожалуйста, опечатку, «проверке диске«.
Скриптами Powershell пользуюсь, но, к сожалению, не так часто, как хотел бы — не хватает опыта. И таки да, примеры Василия Гусева помогают.
Пример скрипта, который я использую в работе — регулярная очистка сервера обновлений WSUs от устаревших, замененных и неиспользуемых файлов обновлений, старых редакций обновлений и компьютеров, которые не подключались к WSUS серверу более 30 дней (все это вместо того, чтобы зайти на консоль WSUS — Параметры — Мастер очистки сервера — нажать «Далее», ждать, пока все не очистится… Долго!):
Еще пример скрипта, может быть полезен админстраторам.
Заведение пользователя посредством скрипта Powershell и csv-файла.
Код Powershell
Код user.csv
Если нужно завести сразу нескольких пользoвателей, такой скрипт выручает очень здорово. Правда, я использую не «чистый» Powershell, а PowerGUI фирмы Quest Software.
equinox, опечатку исправил. Спасибо за примеры — вижу, что хоть кто-то использует PowerShell в работе :)
PowerGUI активно популяризует MVP Дмитрий Сотников, он работает в Quest. Его видео на TechDays тоже интересны — он отличный докладчик.
А попроще, без выпендрежа объяснить можно, я имею ввиду по Русски? То что здесь написано, я ни хрена не понимаю блин! «Откройте Пуск – Поиск – PowerShell» — нет там никакого PowerShell»!
Владимир, ваш комментарий одобрен только потому, что я решил показать интеграцию консолей Windows. На публикацию следующего комментария в таком тоне можете не рассчитывать.
Теперь по сути запуска PowerShell. Откройте командную строку, введите там powershell и нажмите Enter.
Если у вас это тоже не работает, обратитесь в форум за помощью.
Надо добавить пункт «Знаю, но не использую. За ненадобностью.»
А щелчки мышью проще запомнить.
Виталий, автору вопроса мой ответ в письме понравился. Более того, сегодня он прислал еще одно письмо, поблагодарив за подробный рассказ.
Его реакция сильно отличается от вашей, причем в лучшую сторону. Я уверен, что все сделал правильно.
Вадим, спасибо!
Всегда интересно, познавательно и понятно пишите.
А как лично Вы оценивает скорость работы PowerShell? Ведь не секрет что технология опирается на .NET FrameWork, о котором недавно шла речь в комментариях https://www.outsidethebox.ms/12412/#comment-2522
Все NET-программы, с которыми я работал, были тормозными.
Если скорость не смущает, то ощущения от консольных Нет программах должны быть аналогичными.
Лично я стараюсь выбирать «нейтив» программы, но индустрия идёт к Джаве и ДотНету.
Андрей, спасибо за поддержку ;)
Shell, я нечасто использую PowerShell, так что мне трудно оценить скорость. Но думаю, надо рассматривать ее в другом контексте.
PS — это средство управления Windows для администраторов. Думаю, что в первую очередь оно призвано ускорить их работу за счет автоматизации рутинных действий.
Многие административные задачи выполняются через графический интерфейс оснасток. Если задача однократная, вряд ли можно ускорить работу, пытаясь наваять скрипт на PS. Но если задача выполняется регулярно, скрипт сэкономит время неимоверно.
Более того, Microsoft создает графические средства управления, заточенные под создание готовых команд. Посмотрите Создание сценариев в среде управления Exchange: ^Справка по Exchange 2010 SP1.
Вы прошли через мастер, и он показывает вам готовую команду. Даже PS изучать особо не надо :)
Извиняюсь за оффтоп…
Уважаемый Вадим! Давно (и всегда с интересом), читаю Ваш блог. Огромное Вам спасибо, что Вы находите время делиться Вашими знаниями с теми, кто до Вашего уровня пока не дотянул! :)
Ну, и со всеми остальными тоже! :)
Therion1966, спасибо за отклик! Я постараюсь не разочаровать вас в будущем :)
Спасибо, извините за тупость, однако… кхм… у меня не вышло:
Странно, имею 8.1 pro – но нет журналов wininit и chkdsk. А команда powershell для 8 выводит:
Журнал WinLogon вообще пуст, хоть и работает.
Вариантов ровно два:
1. Проверка диска не выполнялась → выполнить
2. Не функционируют журналы событий → в форум
Здравствуйте Вадим !
Вчера проверял весь жёсткий диск командой 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 и состоянии проверяемого диска.
Леонид, вообще, у командлета Select-Object свойства Last и First выводят последние и первые элементы массива. Поэтому -First 1 означает самое старое событие из имеющихся. Если вам надо с датами…. да просто адаптируйте команду для 7 — providername заменить на chkdsk, убрать номер события (он менялся в 8 и 10) и все дела.