Як побачити результати перевірки диска chkdsk однією командою PowerShell - Вадим Стеркиной

  1. У Windows 8 і новіше:
  2. У Windows 7:
  3. Розбір команд
  4. Хто такий постачальник
  5. Як підрахувати середній час трьох останніх завантажень системи

Мій читач Микола виконав   перевірку диска   утилітою chkdsk і зацікавився, де зберігаються її результати Мій читач Микола виконав перевірку диска утилітою chkdsk і зацікавився, де зберігаються її результати. Мої відповіді в листах не настільки докладні, як записи блогу. Однак в даному випадку вичерпну відповідь вклався в пару рядків тексту.

Скопіюйте код в буфер обміну:

У Windows 8 і новіше:

Get-EventLog -LogName Application -Source chkdsk | select -Last 5 -ExpandProperty Message

У Windows 7:

get-winevent -FilterHashTable @ {logname = "Application"; id = "1001"; starttime = "01/01/2011"} | ? {$ _. Providername -match "wininit"} | fl timecreated, message

Натисніть Win, надрукуйте PowerShell і натисніть Enter.

збільшити малюнок
збільшити малюнок

Ви вже зрозуміли, де подивитися звіт перевірки chkdsk?

Розбір команд

Я не випадково згадав вище «журнал» - звіт про перевірку диска зберігається в журналі подій (eventvwr.msc). З нього можна легко витягти дані за допомогою PowerShell.

У Windows 8 змінилися джерело і номер події (chkdsk, 26226), хоча друга нам навіть не знадобилося.

  • Get-EventLog -LogName Application Source chkdsk отримує події з журналу «Додатки» з джерелом chkdsk
  • select -Last 5 -ExpandProperty Message вибирає останні 5 подій (значення можна вказати будь-який) і відображає повідомлення з кожної події

Команда для Windows 7 могла бути коротше, але вона демонструє інший спосіб отримання даних з журналу подій за допомогою PowerShell:

  • get-winevent -FilterHashTable отримує події за допомогою хеш-таблиці фільтра
  • @ {Logname = "Application"; id = "1001"; starttime = "01/01/2011"} | фільтрує журнал «Додатки» (Application), витягуючи події тисяча одна з початку 2011 року, і передає результати далі (|)
  • ? {$ _. 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 = $ events [0] .ToXml () $ event1 = $ events [1] .ToXml () $ event2 = $ 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 не сильний, як і взагалі в скриптах. А як у вас справи?

Результати голосування загублені в зв'язку з припиненням роботи веб-сервісу опитувань.

Обговорення завершено.

А як у вас справи?