Я пытаюсь прочитать сообщения о состоянии системы, чтобы принять некоторые решения в существующих пакетных файлах.
Например, мне действительно нужно знать:
Я не могу найти эту информацию с помощью команд powercfg.
И в более широком смысле, было бы неплохо, если бы я мог просто прочитать из системного журнала любое сообщение и узнать, когда оно было вызвано.
Возможно ли это/доступно через cmd/bat? Можете ли вы запросить все, например? События Kernel-Power? На SO по этому поводу ничего не происходит.
Я не тот, кто проголосовал против, но я подозреваю, что это потому, что ваш вопрос здесь не совсем по теме. Похоже, речь идет не о программировании пакетных файлов, а о поиске команды, которую можно ввести в командную строку. Тот факт, что вы позже вызовете его из пакетного файла, не меняет того факта, что ваш вопрос не касается пакетного программирования (метки, условные выражения, циклы, расширение переменных).
Возможно... Я хотел спросить: «Как я могу получить эту информацию в пакетном файле». Точно так же, как если бы я спросил, как получить эту информацию в проекте .net. Но я думаю, это также мог быть вопрос суперпользователя.
Предполагая, что не существует элегантного способа сделать это, я воспользуюсь планировщиком задач и создам задачу на основе событий для каждого системного события, которое я ищу, и создам файлы флагов 🫤. Тогда мои сценарии, которые запускаются в не связанное с этим время, будут искать флаги... Но это все равно, что почесать левое ухо правой ногой...
Я предполагаю, что также можно сбросить или найти этот системный журнал где-нибудь на диске и просмотреть его... Но это не проще без API/запросов.
Что я имею в виду под элегантным способом:
Теперь вы упомянули API. Да, он определенно есть. Никто не предложил этого в качестве ответа на ваш первоначальный вопрос, потому что пакетные файлы не могут вызывать функции API. Собственный API Learn.microsoft.com/en-us/windows/win32/wes/querying-for-events и .NET API Learn.microsoft.com/en-us/dotnet/api/… Последний можно использовать непосредственно из Powershell (но не из пакета).
Хм, а что касается API из пакета, я предполагал, что вы можете вызвать какой-нибудь exe (или, может быть, какой-нибудь PowerShell) с некоторым аргументом запроса, и он вернет вам результат, который вы ищете 😊 .. Спасибо! Я взгляну.
В моей 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
события и реальным временем пробуждения…
Если вы проголосуете против, пожалуйста, объясните, что такого плохого в моем мышлении или недостатке знаний, чтобы я мог это исправить.