GUID eines Energieschemas auslesen

  • Hallo,
    ich möchte die GUID des momentan aktivierten Energieschemas mit AutoIT auslesen.
    Mein Betriebssystem ist Windows 7 Pro 64-Bit und die AutoIT-Version ist: 3.3.8.1.

    Dafür gibt es ja den Befehl:

    POWERCFG -GETACTIVESCHEME

    in Windows.
    Also habe ich mir damit ein kleines Testscript damit zusammengebaut:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    $Test = Run(@ComSpec & " /c " & 'POWERCFG -GETACTIVESCHEME', "", @SW_HIDE, 2) ;Nicht die Leerzeichen vor und nach "/c" vergessen!
    While 1
    $GUI = StdoutRead($Test)
    If @error Or $GUI <> "" Then
    ExitLoop
    EndIf
    WEnd
    MsgBox(0, "", $GUI)

    [/autoit]

    Aber das gibt immer nur "GUID des Energieschemas:" aus (der ganze Text währe aber "GUID des Energieschemas: 6863a2cd-9633-4633-adc0-e02640b350d7 (Eigener Energiesparplan)".
    (ohne das ...Or $GUI <> "".... im Script, kommt nur ein leeres Fenster).

    Früher unter Windows XP, hatte ich mal ein ähnliches Script zur abfrage des Zustandes eines WLAN-Adapters.
    Der Konsolenbefehl war zwar anders, aber das mit dem auslesen usw., war etwa gleich.
    Da funktionierte das.

    Geht das bei Windows 7 anders ? Oder sind das irgendwie besondere Zeichen, die man erst noch irgendwie umwandeln muss ?

    MfG
    BigRox

    Edit: AutoIT-Version hinzugefügt.

  • Hi,
    du musst auch den kompletten Text auslesen!

    [autoit]

    $Test = Run(@ComSpec & " /c " & 'POWERCFG -GETACTIVESCHEME', "", @SW_HIDE, 2) ;Nicht die Leerzeichen vor und nach "/c" vergessen!
    $GUI=""
    While 1
    $GUI &= StdoutRead($Test)
    If @error Then ExitLoop
    WEnd
    MsgBox(0, "", $GUI)

    [/autoit]
  • Hallo Andy,
    ich habe eben mal deine Lösung probiert.
    Klappt hervorragend, DANKE dafür !

    Aber irgendwie ist es schon sonderbar, dass das hier bei Windows XP funktioniert:

    Spoiler anzeigen
    [autoit]


    Func...
    ....
    ; Den Status des Adapters auslesen.
    $State = Run(@ComSpec & ' /c "devcon status "' & $Device, @SystemDir, @SW_HIDE, 2)
    ; Eine Endlosschleife starten.
    While 1
    $Message = StdoutRead($State)
    ; Die Endlosschleife verlassen, wenn eine Textzeile gefunden wurde, oder keine weiteren Zeilen mehr vorhanden sind.
    If @error Or $Message <> "" Then
    ExitLoop
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ; Die Länge des zurückgegebenen Textes ermitteln um festzustellen, ob das Gerät überhaupt vorhanden ist.
    ; Der WLAN-Adapter ist nicht vorhanden.
    If StringLen($Message) < 30 Then
    GUICtrlSetState($Label_2, $GUI_SHOW)
    ; Die Funktion vorzeitig verlassen.
    Return
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; In der gefundenen Textzeile nach der Zeichenfolge "runing" suchen.
    ; Der Adapter ist aktiviert.
    If StringRegExp($Message, "(\Qrunning\E)") Then
    ....

    [/autoit]


    Da kommt doch auch jede Menge Text raus und irgendwo steht da "The Device is runing" drin, wenn der Adapter aktiviert ist.
    Daher habe ich es genau so probiert und das war wohl nichts, da gab es wohl kleinen Unterschied.


    MfG
    BigRox

  • Hi,
    schau mal in der Hilfe unter StdErrRead(). Dort ist beschrieben, wie es imho RICHTIG gemacht wird!
    Wie du ja selbst festgestellt hast, KANN ein einmaliger Aufruf von StdoutRead() oder StdErrRead() den vollständigen String innerhalb der Console zurückgeben, muss aber nicht!
    Daher bleibt man besser auf der sicheren Seite!

  • Hallo Andy,
    unter StderrRead(), habe ich natürlich nicht nachgesehen und da steht das in den Bemerkungen.

    Das sollte man auch bei StdoutRead() in die "Bemerkungen" schreiben.
    Zudem sollte man die Beispiele zu beiden Funktionen auch so ändern.

    Anscheinend ist es ja nur Zufall o.ä., dass mein Windows XP-Script überhaupt ohne Schleife funktioniert.

    Mfg
    BigRox