stefan007
Goto Top

Energieoptionen per PowerShell ändern

Hi,

gibt es eine Möglichkeit um per Scripte zwischen höchsten Energiesparoptionen und maximaler Leistung per Knopfdruck zu wechseln?
Falls es zum jeweiligen OS Unterschiede dabei gibt, dann soll sich die Frage nur auf Windows 10 Pro beziehen.

Gruß,

Stefan

Content-Key: 351561

Url: https://administrator.de/contentid/351561

Printed on: July 20, 2024 at 19:07 o'clock

Mitglied: 134464
134464 Oct 12, 2017 updated at 11:04:16 (UTC)
Goto Top
Member: MrCount
Solution MrCount Oct 12, 2017 at 11:06:23 (UTC)
Goto Top
Servus,

hier mal ein Beispiel, wie man diverse Settings macht:
@echo off
CHCP 1252

:: unplugged
set "u_monitor=10"  
set "u_standby=15"  
set "u_hibernate=0"  

:: plugged in
set "p_monitor=0"  
set "p_standby=0"  
set "p_hibernate=0"  

REM (Höchstleistung)
powercfg -SETACTIVE 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c

REM (Ausbalanciert)
REM powercfg -SETACTIVE 381b4222-f694-41f0-9685-ff5bb260df2e

REM (Energiesparmodus)
REM powercfg -SETACTIVE a1841308-3541-4fab-bc81-f71556f20b4a

::Set the unplugged settings
powercfg.exe -change -monitor-timeout-dc %u_monitor%
powercfg.exe -change -standby-timeout-dc %u_standby%
powercfg.exe -change -hibernate-timeout-dc %u_hibernate%

::Set the plugged in settings
powercfg.exe -change -monitor-timeout-ac %p_monitor%
powercfg.exe -change -standby-timeout-ac %p_standby%
powercfg.exe -change -hibernate-timeout-ac %p_hibernate%

In Zeile 15 wird das Schema gesetzt...
Member: rubberman
rubberman Oct 12, 2017 at 11:08:08 (UTC)
Goto Top
@echo off &setlocal DisableDelayedExpansion

:: Alle Energiesparpläne mit Name und GUID, sowie Index des aktiven Energiesparplans speichern
set "n="  
for /f "tokens=1,2* delims=:" %%g in (  
  'powercfg -list^|findstr /rc:": [0-9a-f][0-9a-f]*-[0-9a-f][0-9a-f]*-[0-9a-f][0-9a-f]*-[0-9a-f][0-9a-f]*-[0-9a-f][0-9a-f]* "^|findstr /n .'  
) do for /f "tokens=1*" %%j in ("%%i") do for /f "tokens=1* delims=()" %%l in ("%%k") do (  
  set /a "n=%%g"  
  set "guid%%g=%%j"  
  set "name%%g=%%l"  
  if "%%m" neq "" set "active=%%g"  
)
if not defined n exit /b

:: Gefundene Energiesparpläne zur Auswahl stellen
setlocal EnableDelayedExpansion
for /l %%i in (1 1 %n%) do (
  <nul set /p =%%i - "!name%%i!"  
  if %%i equ %active% (echo  ^(AKTIV^)) else echo(
)
echo ~~~~~~~~~~~~~~

:: Eingabeaufforderung und eingegebenen Wert prüfen
:input_loop
set "idx=_"  
set /p "idx=Neues Energieschema: "  
call :check idx 1 %n% || goto input_loop

:: Ausgewählten Energiesparplan aktivieren und Scriptausführung beenden
powercfg -setactive !guid%idx%!
exit /b


:: Subroutine für die Prüfung des eingegebenen Werts
:check VarName Min Max
setlocal EnableDelayedExpansion
for /f "delims=1234567890 eol=" %%i in ("!%~1!") do (endlocal &exit /b 1)  
2>nul set /a "dummy=!%~1!" || (endlocal &exit /b 1)  
if "!%~1!" neq "%dummy%" (endlocal &exit /b 1)  
if %dummy% lss %~2 (endlocal &exit /b 1)
if %dummy% gtr %~3 (endlocal &exit /b 1)
endlocal &exit /b 0
Maybe face-wink
Ist allerdings auch nur Batch und nicht Powershell.

Grüße
Steffen
Mitglied: 134464
134464 Oct 12, 2017 at 11:26:38 (UTC)
Goto Top
powercfg lässt sich ja problemlos auch in der powershell Konsole verwenden.
Member: rubberman
rubberman Oct 13, 2017 at 06:40:58 (UTC)
Goto Top
Joa kann man, hatte ich aber nicht parat.
Versuch:
# Alle Energiesparpläne als Matches-Array speichern
$matches_arr = (powercfg -l) |
  Select-String -Pattern "^.+ ([0-9A-Fa-f]{8}(-[0-9A-Fa-f]{4}){3}-[0-9A-Fa-f]{12})\s+\((.+)\)\s*(\**)$" |  
  %{$_.Matches}

# Gefundene Energiesparpläne zur Auswahl stellen
for ($i=0; $i -lt $matches_arr.Length; $i++) {
  Write-Host ($i + 1) - `"$($matches_arr[$i].Groups[3].Value)`" $(If ($matches_arr[$i].Groups[4].Value -eq "*") {"(AKTIV)"})  
}
"~~~~~~~~~~~~~~"  

# Eingabeaufforderung und eingegebenen Wert prüfen
do {
  try {
    $idx = [int]$(Read-Host -Prompt "Neues Energieschema")  
  }
  catch {}
} until ($idx -gt 0 -and $idx -le $matches_arr.Length)

# Ausgewählten Energiesparplan aktivieren
powercfg -setactive $matches_arr[$idx - 1].Groups[1].Value
Grüße
Steffen
Member: Stefan007
Stefan007 Oct 14, 2017 at 11:24:25 (UTC)
Goto Top
Zitat von @MrCount:

Servus,

hier mal ein Beispiel, wie man diverse Settings macht:
@echo off
> CHCP 1252
> 
> :: unplugged
> set "u_monitor=10"  
> set "u_standby=15"  
> set "u_hibernate=0"  
> 
> :: plugged in
> set "p_monitor=0"  
> set "p_standby=0"  
> set "p_hibernate=0"  
> 
> REM (Höchstleistung)
> powercfg -SETACTIVE 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
> 
> REM (Ausbalanciert)
> REM powercfg -SETACTIVE 381b4222-f694-41f0-9685-ff5bb260df2e
> 
> REM (Energiesparmodus)
> REM powercfg -SETACTIVE a1841308-3541-4fab-bc81-f71556f20b4a
> 
> ::Set the unplugged settings
> powercfg.exe -change -monitor-timeout-dc %u_monitor%
> powercfg.exe -change -standby-timeout-dc %u_standby%
> powercfg.exe -change -hibernate-timeout-dc %u_hibernate%
> 
> ::Set the plugged in settings
> powercfg.exe -change -monitor-timeout-ac %p_monitor%
> powercfg.exe -change -standby-timeout-ac %p_standby%
> powercfg.exe -change -hibernate-timeout-ac %p_hibernate%
> 

In Zeile 15 wird das Schema gesetzt...

-> sind das nur Copy and Paste Fehler in Zeile 18 und 21? ^^ Ansonsten ist es genau das was ich wollte, vielen Dank dafür!
Member: rubberman
rubberman Oct 14, 2017 at 11:36:20 (UTC)
Goto Top
Was meinst du denn mit Copy and Paste Fehler? Ggf. weichen die GUIDs auf deinem Rechner ab. Darum würde es eigentlich Sinn machen die Ausgabe von POWERCFG - L zu verarbeiten, wie oben gezeigt.

Grüße
rubberman
Member: Stefan007
Stefan007 Oct 14, 2017 at 11:43:00 (UTC)
Goto Top
wenn ich das rem aus Zeile 18 und 21 entferne dann geht es.
Member: rubberman
rubberman Oct 14, 2017 at 11:46:55 (UTC)
Goto Top
REM steht für Remark und macht eine Zeile zum Kommentar. Dir ist klar dass der Code dir nur Beispielaufrufe zeigt? Wenn du einen der Energiesparpläne nutzen willst musst du genau bei diesem das REM entfernen und bei den anderen setzen.

Steffen
Member: rubberman
Solution rubberman Oct 14, 2017 updated at 14:02:00 (UTC)
Goto Top
OK, um die Verwirrung mal zu beenden ...
Wenn du die beiden GUIDs kennst, zwischen denen du wechseln willst (und falls nicht führe POWERCFG -L in einem Konsolefenster aus), dann ist das doch relativ simpel.
@echo off &setlocal
:: Die beiden GUIDs zwischen denen gewechselt wird
set "high=8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c"  
set "low=a1841308-3541-4fab-bc81-f71556f20b4a"  
:: Prüfen, welches Schema aktiv ist und das jeweils andere aktivieren
powercfg -l|>nul findstr /e "%high%.*\*"&&(powercfg -setactive %low%)||(powercfg -setactive %high%)  
:: Kontrollausgabe
for /f "tokens=2 delims=()" %%i in ('powercfg -l^|findstr /e "\*"') do echo Aktiviert: %%i&>nul timeout 2  
Wenn du die Kontrollausgabe nicht brauchst, schmeißt du sie einfach raus.
Und ... natürlich kannst du vorher deine eigenen Energiesparpläne anlegen und nach deinen Vorstellungen konfigurieren.

Steffen
Member: MrCount
MrCount Oct 16, 2017 at 05:43:21 (UTC)
Goto Top
Wie @rubberman schon richtig erwähnt hat, sind die Zeilen "auskommentiert". face-wink
REM steht für Remark und macht eine Zeile zum Kommentar.

Der Code diente auch nur als Beispiel. Daraus kannst du, wie von rubberman ja schon getan, dir dein Script zusammenstellen.
Member: nikmaier
nikmaier Dec 02, 2018 at 09:01:21 (UTC)
Goto Top
Hallo rubberman,
ich finde die Batch perfekt, gibt es eine Möglichkeit einen bestimmten Energiesparplan der immer den gleichen Namen hat fest auszuwählen ohne Auswahl?
Hintergrund ist der, dass ich bei einigen Rechnern das Schema "Ultimate Power" aktiviere, nur dann hat dies immer eine andere GUID, somit kann ich das nicht festlegen.
Es müsste quasi die GUID ausgelesen werden und dann die GUID mit dem Namen "Ultimate Power" fest aktiviert werden.

Weißt du wie ich das machen könnte?

Danke im Voraus.
Mitglied: 137846
137846 Dec 02, 2018 updated at 10:21:37 (UTC)
Goto Top
Zitat von @nikmaier:
Es müsste quasi die GUID ausgelesen werden und dann die GUID mit dem Namen "Ultimate Power" fest aktiviert werden.
Für die Ausführung innerhalb einer Batch:
for /f "tokens=4" %%a in ('powercfg -l ^| findstr /ilc:"Ultimate Power"') do powercfg -setactive %%a  
Für's Ausprobieren in der Konsole müssen die doppelten Prozentzeichen durch einfache ersetzt werden.

Schönen 1. Advent
Gruß A.
Member: nikmaier
nikmaier Dec 02, 2018 at 12:38:06 (UTC)
Goto Top
Klasse, so schnell hätte ich jetzt nicht mit einer Antwort gerechnet face-smile

Funktioniert perfekt, vielen Dank!

Und ebenfalls einen schönen 1. Advent.
Member: nikmaier
nikmaier Dec 03, 2018 at 13:14:01 (UTC)
Goto Top
Hallo,
jetzt hätte ich doch noch etwas, was ich leider nicht hinbekomme.

Es soll via Batch geschaut werden ob es einen Eintrag bei "powercfg -l" gibt der "Ultimative Leistung" heißt, das wird ja mit dem Tip von answer gemacht:

for /f "tokens=4" %%a in ('powercfg -l ^| findstr /ilc:"Ultimate Power"') do powercfg -setactive %%a

Nun soll folgendes passieren:

Wenn es den Eintrag schon gibt, dann soll dieser aktiviert werden "powercfg -setactive %%a)
wenn es den Eintrag aber nicht gibt, dann soll er erstellt werden mit "powercfg -duplicatescheme e9a42b02-d5df-448d-aa00-03f14749eb61" und danach soll dieser aktiv gesetzt werden "for /f "tokens=4" %%a in ('powercfg -l ^| findstr /ilc:"Ultimate Power"') do powercfg -setactive %%a".

Ich es müsste jetzt bestimmt nur richtig zusammen gesetzt werden, aber ich hab jetzt vielen probiert, aber ich bekomm es nicht hin.

Vielleicht kann mir hier noch jemand auf die Sprünge helfen face-smile

Schonmal vielen Dank im Voraus.
Mitglied: 137846
137846 Dec 03, 2018 updated at 13:45:22 (UTC)
Goto Top
Dir ist schon klar das du hier einen fremden Thread für deine Zwecke übernimmst?!
Discussion guidelines - The rules for our content

Und wie man prüfen kann ob es einen Eintrag gibt steht in Rubbermans Thread mit findstr schon fix und fertig drin, brauchst du also nur zusammensetzen.
Member: nikmaier
nikmaier Dec 03, 2018 updated at 13:49:38 (UTC)
Goto Top
Ok, sorry, ich dachte das ist in Ordnung, da es ja um das selbe Thema geht und es vielleicht für den ein oder anderen interessant ist falls er diesen Thread liest.
Dann such ich mal nach dem Thema von Rubberman.

Trotzdem danke.
Member: Stefan007
Stefan007 Dec 03, 2018 at 13:52:06 (UTC)
Goto Top
Frechheit face-smile