Пакетное чтение события Kernel-Power из журнала средства просмотра системных событий?

Я пытаюсь прочитать сообщения о состоянии системы, чтобы принять некоторые решения в существующих пакетных файлах.

Например, мне действительно нужно знать:

  • если система включена, потому что она вышла из спящего режима, или была холодная загрузка с помощью кнопки или сети и т. д.
  • время (или как давно) произошло последнее пробуждение ото сна.

Я не могу найти эту информацию с помощью команд powercfg.

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

Возможно ли это/доступно через cmd/bat? Можете ли вы запросить все, например? События Kernel-Power? На SO по этому поводу ничего не происходит.

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

Spectraljump 06.05.2024 19:22

Я не тот, кто проголосовал против, но я подозреваю, что это потому, что ваш вопрос здесь не совсем по теме. Похоже, речь идет не о программировании пакетных файлов, а о поиске команды, которую можно ввести в командную строку. Тот факт, что вы позже вызовете его из пакетного файла, не меняет того факта, что ваш вопрос не касается пакетного программирования (метки, условные выражения, циклы, расширение переменных).

Ben Voigt 06.05.2024 20:35

Возможно... Я хотел спросить: «Как я могу получить эту информацию в пакетном файле». Точно так же, как если бы я спросил, как получить эту информацию в проекте .net. Но я думаю, это также мог быть вопрос суперпользователя.

Spectraljump 06.05.2024 20:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Предполагая, что не существует элегантного способа сделать это, я воспользуюсь планировщиком задач и создам задачу на основе событий для каждого системного события, которое я ищу, и создам файлы флагов 🫤. Тогда мои сценарии, которые запускаются в не связанное с этим время, будут искать флаги... Но это все равно, что почесать левое ухо правой ногой...

Я предполагаю, что также можно сбросить или найти этот системный журнал где-нибудь на диске и просмотреть его... Но это не проще без API/запросов.

Что я имею в виду под элегантным способом:

  • некоторые Windows API для запроса к базе данных/журналу: ?
  • какой-то внешний инструмент: я видел в другом посте десятилетней давности, что какой-то инструмент синтаксического анализа журналов, возможно, этот Microsoft Log Parser, имеет некоторый API для запроса событий, но больше не может найти никаких документов.

Теперь вы упомянули API. Да, он определенно есть. Никто не предложил этого в качестве ответа на ваш первоначальный вопрос, потому что пакетные файлы не могут вызывать функции API. Собственный API Learn.microsoft.com/en-us/windows/win32/wes/querying-for-eve‌​nts и .NET API Learn.microsoft.com/en-us/dotnet/api/… Последний можно использовать непосредственно из Powershell (но не из пакета).

Ben Voigt 06.05.2024 20:31

Хм, а что касается API из пакета, я предполагал, что вы можете вызвать какой-нибудь exe (или, может быть, какой-нибудь PowerShell) с некоторым аргументом запроса, и он вернет вам результат, который вы ищете 😊 .. Спасибо! Я взгляну.

Spectraljump 06.05.2024 20:34
Ответ принят как подходящий

В моей Microsoft Windows [версия 10.0.22631.3527]: powercfg.exe /lastwake может вернуться (некоторые специальные примеры):

  • если система включена из-за холодной загрузки:
Wake History Count - 0
  • если система включена, поскольку она вышла из спящего режима с помощью кнопки питания:
Wake History Count - 1
Wake History [0]
  Wake Source Count - 1
  Wake Source [0]
    Type: Fixed Feature
    Power Button
  • если система включена, потому что вышла из спящего режима по щелчку мыши:
Wake History Count - 1
Wake History [0]
  Wake Source Count - 1
  Wake Source [0]
    Type: Device
    Instance Path: PCI\VEN_8086&DEV_7AE0&SUBSYS_7D461462&REV_11\3&11583659&0&A0
    Friendly Name: Intel(R) USB 3.20 eXtensible Host Controller - 1.20 (Microsoft)
    Description: USB xHCI Compliant Host Controller
    Manufacturer: Generic USB xHCI Host Controller

Время последнего пробуждения ото сна:

wmic path Win32_NTLogEvent WHERE "logfile='system' and SourceName='Microsoft-Windows-Power-Troubleshooter' and EventCode=1" Get Message /Value | findstr /I "Time"

или

wmic path Win32_NTLogEvent WHERE "logfile='system' and SourceName='Microsoft-Windows-Power-Troubleshooter' and EventCode=1" Get TimeGenerated

К сожалению, обе приведенные выше команды могут выдать огромный результат, который сложно проанализировать в cmd или в .cmd скрипте.

Я бы рекомендовал вызывать команды PowerShell следующим образом (легко разобрать даже в cmd):

powershell -noprofile -command "$x=Get-EventLog -LogName System -EntryType Information -InstanceId 1 -Source Microsoft-Windows-Power-Troubleshooter -After $(Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object -ExpandProperty LastBootUpTime) -Newest 1 | Select-Object -ExpandProperty TimeGenerated; if ($x) {$x.ToString()} else {''}"
10.05.2024 16:35:46

Примечание: не учитывалась неуловимая разница между TimeGenerated события и реальным временем пробуждения…

Другие вопросы по теме