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-ID: 351561

Url: https://administrator.de/forum/energieoptionen-per-powershell-aendern-351561.html

Ausgedruckt am: 21.12.2024 um 14:12 Uhr

134464
134464 12.10.2017 aktualisiert um 13:04:16 Uhr
Goto Top
MrCount
Lösung MrCount 12.10.2017 um 13:06:23 Uhr
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...
rubberman
rubberman 12.10.2017 um 13:08:08 Uhr
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
134464
134464 12.10.2017 um 13:26:38 Uhr
Goto Top
powercfg lässt sich ja problemlos auch in der powershell Konsole verwenden.
rubberman
rubberman 13.10.2017 um 08:40:58 Uhr
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
Stefan007
Stefan007 14.10.2017 um 13:24:25 Uhr
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!
rubberman
rubberman 14.10.2017 um 13:36:20 Uhr
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
Stefan007
Stefan007 14.10.2017 um 13:43:00 Uhr
Goto Top
wenn ich das rem aus Zeile 18 und 21 entferne dann geht es.
rubberman
rubberman 14.10.2017 um 13:46:55 Uhr
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
rubberman
Lösung rubberman 14.10.2017 aktualisiert um 16:02:00 Uhr
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
MrCount
MrCount 16.10.2017 um 07:43:21 Uhr
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.
nikmaier
nikmaier 02.12.2018 um 10:01:21 Uhr
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.
137846
137846 02.12.2018 aktualisiert um 11:21:37 Uhr
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.
nikmaier
nikmaier 02.12.2018 um 13:38:06 Uhr
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.
nikmaier
nikmaier 03.12.2018 um 14:14:01 Uhr
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.
137846
137846 03.12.2018 aktualisiert um 14:45:22 Uhr
Goto Top
Dir ist schon klar das du hier einen fremden Thread für deine Zwecke übernimmst?!
Diskussionsrichtlinien - die Regeln zu unseren Inhalten

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.
nikmaier
nikmaier 03.12.2018 aktualisiert um 14:49:38 Uhr
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.
Stefan007
Stefan007 03.12.2018 um 14:52:06 Uhr
Goto Top
Frechheit face-smile