2016-05-02 11 views
-1

バッテリーのパーセンテージを監視するためのVBスクリプトの作成。 > 95の場合は、プラグを抜きます。 < 20の場合は、充電器を差し込むか、または休止状態にしてください。バッテリーが20%以下になると、ポップアッププラグイン充電器とヘリップがあります。 10秒以内にシステムが接続されていても、elseの部分に行き、冬眠します。 「システムは休止しない」部分には入力しません。条件が正常に動作しない場合

hibernate.batは、Windows7を休止するための単純なバッチスクリプトです。 コードは決して終わりではありませんforループです。do whileループは、シェルスクリプトで 'continue'を複製するために使用されます。バッテリーが20%に達すると、プラグイン充電器に10秒の時間が与えられます。課金された場合は、ループの繰り返しのために次へ進む必要があります。 「有料の場合」のループは入力されていません。どうして?

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

可能な複製(HTTP ://stackoverflow.com/questions/3944062/continue-to-next-iteration-on-vbscript) – anishsane

+0

重複として閉じるために広がっています。 – MikeC

答えて

0

これはあなたの問題である:

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

ChargingDischarging状態がお互いの逆です。 Dischargingがtrueの場合、Chargingはfalseであり、その逆もあります。このため、Chargingの値は、ElseIfブランチを入力すると、常にFalseとなります。また、変数の値は割り当て時の状態を反映しているので、電源コードを差し込んだ後でも、はまだFalseです。バッテリ状態が変化した場合、変数は自動的に更新されません。遅れてもコードが正常に動作するようにするには、バッテリーの状態を再評価する必要があります。そのために私は2つの関数にWMIのルックアップをリファクタリングすることをお勧めしたい:

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 

と、このようにそれらを使用します。

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 
[VBScriptの上(次の反復に)「続行」]の
関連する問題