2016-05-02 16 views
-1

Schreiben eines VB-Skripts zur Überwachung des Batterieprozentsatzes. Wenn es> 95 ist, ziehen Sie den Stecker aus der Steckdose. Wenn < 20, Stecker Ladegerät oder sonst Winterschlaf und so weiter. Wenn die Batterie unter 20% sinkt, gibt es ein Popup-Plug-in-Ladegerät & hellip; und obwohl innerhalb von 10 sec das System eingesteckt ist, geht es an else teil und überwintert. Es wird nicht "System wird nicht überwintert" angezeigt.wenn die Bedingung nicht wie gewünscht funktioniert

hibernate.bat ist ein einfaches Batch-Skript zum Winterschlaf Windows7. Der Code ist eine nie endende for-Schleife, in der while-Schleife verwendet wird, um 'continue' in Shell-Skripten zu replizieren. Wenn der Akku 20% erreicht, wird dem Plugin-Ladegerät 10 Sekunden Zeit zugewiesen. Wenn geladen, muss es für die Schleifeniteration zum nächsten gehen. "Wenn geladen" Schleife wird nicht eingegeben. Warum?

Set oLocator = CreateObject("WbemScripting.SWbemLocator") 
Set oServices = oLocator.ConnectServer(".","root\wmi") 
Set oResults = oServices.ExecQuery("select * from batteryfullchargedcapacity") 
For Each oResult In oResults 
    iFull = oResult.FullChargedCapacity 
Next 

For i=1 To 10 
    Do 
     i=+2 
     Set oResults = oServices.ExecQuery("select * from batterystatus") 
     For Each oResult In oResults 
      iRemaining = oResult.RemainingCapacity 
      Charging = oResult.Charging 
      Discharging = oResult.Discharging 
     Next 

     iPercent = ((iRemaining/iFull) * 100) Mod 100 
     If Charging And (iPercent > 95) Then 
      MsgBox "Unplug Charger. Battery is at " & iPercent & "%", vbInformation, "Battery monitor" 
     ElseIf Discharging And (iPercent < 20) Then 
      MsgBox "Plug-in Charger. Battery is at " & iPercent & "%", vbInformation, "Battery monitor" 
      WScript.Sleep 10000 ' 10 sec 
      If Charging Then 
       CreateObject("WScript.Shell").Popup "System won't hibernate", 5, "Good News!!!" 
       Exit Do 
      Else 
       Set shell = CreateObject("WScript.Shell") 
       shell.CurrentDirectory = "C:\Users\abcd\Desktop" 
       CreateObject("WScript.Shell").Popup "System will hibernate", 5, "Hmm..." 
       shell.Run "hibernate.bat" 
       Exit For 
      End If 
     End If 
    Loop While False 
Next 
+1

Mögliches Duplikat [ "Weiter" (zur nächsten Iteration) auf VBScript] (http : //stackoverflow.com/questions/3944062/continue-to-next-iteration-on-vbscript) – anishsane

+0

Zum Schließen als Duplikat erweitert. – MikeC

Antwort

0

Das ist Ihr Problem:

ElseIf Discharging And (iPercent < 20) Then 
    ... 
    If Charging Then 
     ... 
    Else 
     ... 
    End If 
End If 

Die Charging und Discharging Zustand die Umkehrung voneinander sind. Wenn Discharging wahr ist, dann ist Charging falsch und umgekehrt. Aus diesem Grund ist der Wert ChargingimmerFalse, wenn Sie die ElseIf Zweig eingeben. Und da der Wert der Variablen den Zustand zum Zeitpunkt der Zuweisung widerspiegelt, ist es nochFalse, auch nachdem Sie ein Netzkabel einstecken. Die Variable aktualisiert sich nicht automatisch, wenn sich der Batteriestatus ändert. Sie müssen den Batteriestatus nach der Verzögerung neu auswerten, damit der Code wie erwartet funktioniert. Dafür würde ich vorschlagen, den WMI-Lookup in zwei Funktionen Refactoring:

Function IsCharging 
    For Each oResult In oServices.ExecQuery("SELECT * FROM BatteryStatus") 
     IsCharging = oResult.Charging 
    Next 
End Function 

Function GetRemainingCapacity 
    For Each oResult In oServices.ExecQuery("SELECT * FROM BatteryStatus") 
     GetRemainingCapacity = oResult.RemainingCapacity 
    Next 
End Function 

und sie wie folgt verwendet werden:

Do 
    iPercent = ((GetRemainingCapacity/iFull) * 100) Mod 100 
    If IsCharging And (iPercent > 95) Then 
     ... 
    ElseIf Not IsCharging And (iPercent < 20) Then 
     ... 
     If IsCharging Then 
      ... 
     Else 
      ... 
     End If 
    End If 
Loop While True 
Verwandte Themen