Я пытаюсь использовать powershell , чтобы запросить некоторые параметры питания Windows из вывода powercfg
.У меня достаточно информации, чтобы сузить диапазон до подгруппы настроек, но в текстовом блоке мне все еще нужно найти соответствующий параметр, используя GUID, а затем мне нужно извлечь текущее значение параметра.Я смог добиться этого, используя Select-String -Context
, но он не динамический и, следовательно, подвержен ошибкам.Я ищу более чистый способ извлечения значения.
Вот пример текстового блока, который у меня есть (хранится в $block
):
Power Scheme GUID: 381b4222-f694-41f0-9685-ff5bb260df2e (Balanced)
GUID Alias: SCHEME_BALANCED
Subgroup GUID: 238c9fa8-0aad-41ed-83f4-97be242c8f20 (Sleep)
GUID Alias: SUB_SLEEP
Power Setting GUID: 29f6c1db-86da-48c5-9fdb-f2b67b1f44da (Sleep after)
GUID Alias: STANDBYIDLE
Minimum Possible Setting: 0x00000000
Maximum Possible Setting: 0xffffffff
Possible Settings increment: 0x00000001
Possible Settings units: Seconds
Current AC Power Setting Index: 0x00000708
Current DC Power Setting Index: 0x00000384
Power Setting GUID: 94ac6d29-73ce-41a6-809f-6363ba21b47e (Allow hybrid sleep)
GUID Alias: HYBRIDSLEEP
Possible Setting Index: 000
Possible Setting Friendly Name: Off
Possible Setting Index: 001
Possible Setting Friendly Name: On
Current AC Power Setting Index: 0x00000001
Current DC Power Setting Index: 0x00000001
Power Setting GUID: 9d7815a6-7ee4-497e-8888-515a05f02364 (Hibernate after)
GUID Alias: HIBERNATEIDLE
Minimum Possible Setting: 0x00000000
Maximum Possible Setting: 0xffffffff
Possible Settings increment: 0x00000001
Possible Settings units: Seconds
Current AC Power Setting Index: 0x00002a30
Current DC Power Setting Index: 0x00002a30
Power Setting GUID: bd3b718a-0680-4d9d-8ab2-e1d2b4ac806d (Allow wake timers)
GUID Alias: RTCWAKE
Possible Setting Index: 000
Possible Setting Friendly Name: Disable
Possible Setting Index: 001
Possible Setting Friendly Name: Enable
Possible Setting Index: 002
Possible Setting Friendly Name: Important Wake Timers Only
Current AC Power Setting Index: 0x00000001
Current DC Power Setting Index: 0x00000001
Скажите, что я хочу извлечьзначение переменного тока для Allow hybrid sleep
, которое в этом случае составляет 0x00000001
.У меня есть setting_guid
, доступный для вставки в строку запроса.
Сейчас я использую этот фрагмент кода для динамического извлечения значения определенного параметра:
$block = powercfg /q #{scheme_guid} #{sub_guid}
$setting = $block | Select-String -Pattern #{setting_guid} -Context 0, 8 | %{$_.Context.PostContext}
$line = $setting | Select-String -Pattern 'Current #{ac_or_dc} Power Setting Index'
$line -match 'Current #{ac_or_dc} Power Setting Index: (?<value>0x.{8})'
Write-Output ([int]$matches['value'])
Этосейчас работает нормально, но жестко заданный -Context 0, 8
не очень желателен, потому что иногда блоки могут быть очень короткими или длинными, и мой запрос не сможет извлечь значение или он получит неправильную строку.Я надеюсь найти более понятный способ сделать это, желательно программным и понятным для человека ( regex хорошо, если это имеет смысл).