9 Replies Latest reply on Oct 6, 2014 1:14 AM by derniwi

    Rechnen in eScript

    derniwi Master
      Hallo,

      da es nur rudimentäre Rechenoperationen über eScript gibt, habe ich mal ein VB-Skript zum Rechnen erstellt (VBCalculator.vbs).
      ' VBCalculator
      ' A simple calculator using registry values
      ' Author: Nils Winkler
      ' History:
      ' 2014-08-27: v1.0

      Option Explicit
      Dim varA
      Dim varB
      Dim varOperator
      Dim varResult
      Dim varMsg
      Dim bOK

      ' Read and check the variable which have to be set in the eScript
      ' varName: name of the registry variable
      ' Returns "ERR" in case of any error or the value as double data type
      Function getVar( ByVal varName )
      getVar = "ERR"
      On Error Resume Next
      getVar = NIGetVar( varName )
      If ( 0 = err.number ) Then
        If ( "" = getVar ) Then
         bOK = False
         varMsg = varMsg & " " & varName & " empty"
        Else
         getVar = CDbl( getVar )
         If ( 0 <> err.number ) Then
          bOK = False
          varMsg = varMsg & " Error converting " & getVar
         End If 
        End If
      Else
        bOK = False
        varMsg = varMsg & " " & varName & " not Found"
      End If

      On Error Goto 0
      End Function

      ' Read and check the operator which have to be set in the eScript
      ' Returns "ERR" in case of any error or the operator as one of "+", "-", "*", "/" and "^"
      Function getOperator( ByVal varName )
      getOperator = "ERR"
      On Error Resume Next
      getOperator = NIGetVar( varName )
      If ( 0 = err.number ) Then
        If ( "" = getOperator ) Then
         bOK = False
         varMsg = varMsg & " " & varName & " empty"
        Else
         If (( "+" <> getOperator ) AND _
          ( "-" <> getOperator ) AND _
          ( "*" <> getOperator ) AND _
          ( "/" <> getOperator ) AND _
          ( "\" <> getOperator ) AND _
          ( "^" <> getOperator ) AND _
          ( "ABS" <> getOperator ) AND _
          ( "HEX" <> getOperator ) AND _
          ( "RND" <> getOperator )) Then
          bOK = False
          varMsg = varMsg & " Unknown operator: " & getOperator
         End If 
        End If
      Else
        bOK = False
        varMsg = varMsg & " " & varName & " not Found"
      End If

      On Error Goto 0
      End Function

      ' Initialize variables
      bOK = True
      varMsg = ""
      varResult = "ERR"

      ' Get variables
      varA = getVar( "varA" )
      varB = getVar( "varB" )

      ' Get operator
      varOperator = getOperator( "varOperator" )

      ' If everything is ok calculate
      If bOK Then
      On Error Resume Next
      Select Case varOperator
        Case "+" ' Addition
         varResult = varA + varB
        Case "-" ' Subtraction
         varResult = varA - varB
        Case "*" ' Multiplication
         varResult = varA * varB
        Case "/" ' Division
         varResult = varA / varB
        Case "\" ' Integer division
         varResult = CLng( varA / varB )
        Case "^" ' Exponentiation
         varResult = varA ^ varB
        Case "ABS" ' Absolute value
         varResult = Abs( varA )
        Case "HEX" ' Convert varA to hex
         varResult = Hex( varA )
        Case "RND" ' Random
         varResult = Rnd( varA )
        Case Else
         varMsg = varMsg & " Unknown operator: " & varOperator
      End Select

      ' Calculation error handling
      If ( 0 <> err.number ) Then
        varResult = "ERR"
        varMsg = varMsg & " Error " & Err.Description
      End If
      On Error Goto 0
      End If

      ' Write result and message to eScript variables
      NISetVar "varResult", Trim( CStr( varResult ))
      NISetVar "varMsg", Trim( varMsg )


      Verwendet wird das wie folgt:
      If DiskFree('C:')<4194304
      Set('_WMI_DeviceID','')
      Set('_WMI_FreeSpace','')
      WMISimpleQuery('\\.\root\cimv2','WIN32_LOGICALDISK','DeviceID=C:','_WMI_')
        FreeSpace
      EndProc/TS
      !
      Set('varA','%_WMI_FreeSpace%')
      Set('varB','1048576')
      Set('varOperator','\')
      CallScript('.\Extern$\VBCalculator.vbs','')/TS
      If %varMsg%=''
        ExitProcEx(Done,'freier Speicher: %varResult% MB')
      Else
        ExitProcEx(Done,'freier Speicher: %_WMI_FreeSpace% Bytes')


      Aktuell habe ich nur Addition ("+"), Subtraktion ("-"), Multiplikation ("*"), Division ("/") und Potenzierung ("^") eingebunden. Aber weitere Anpassungen sind ja denkbar, wie z.B. Integer-Division, Modulo oder auch Absolutwer (Betrag).

      Wollte euch das nicht vorenthalten und freue mich über weitere Vorschläge und Verbesserungen. :-)

      Gruß
      Nils
        • 1. Re: Rechnen in eScript
          _Mel_ Master
          Vorschlag: nicht die registry zum datenaustausch nehmen, sondern normale variablen, die man ja auch in scripten abfragen und setzen kann.

          damit könntest du das eScript vereinfachen zu

          If DiskFree('C:')<4194304
          Set('_WMI_DeviceID','')
          Set('_WMI_FreeSpace','')
          WMISimpleQuery('\\.\root\cimv2','WIN32_LOGICALDISK','DeviceID=C:','_WMI_')
            FreeSpace
          EndProc/TS
          !
          Set('varA', '%_WMI_FreeSpace%')
          Set('varB','1048576')
          Set('varOperator','/')
          CallScript('.\Extern$\VBCalculator.vbs','')
          If %varMsg%=''
            ExitProcEx(Done,'freier Speicher: %varResust% MB')
          Else
            ExitProcEx(Done,'freier Speicher: %_WMI_FreeSpace% Bytes')

          und das vbscript wäre auch etwas einfacher
          • 2. Re: Rechnen in eScript
            NicoS1 Master
            Sehe ich ebenfalls als Potentielle Optimierung

            Wenn du mit CallScript arbeitest, kannst du in deinem VBScript sehr einfach Funktionen benutzen um einerseits im eScript gesetzte Variablen auszulesen, und auch wieder Variablen befüllen:

            Variable aus eScript lesen würde so aussehen:
            varA = nigetvar("_WMI_FreeSpace")

            eScript Variable setzen:

            nisetvar "DSMVariable",vbErgebnis
            • 3. Re: Rechnen in eScript
              derniwi Master
              Hallo,

              ja, an NiGetVar / NiSet Var hatte ich gar nicht gedacht.

              Ich habe die Skripte im ersten Thread mal aktualisiert und auch noch mit ein paar Funktionen erweitert.

              Danke und Gruß
              Nils
              • 4. Re: Rechnen in eScript
                Ratzratz Expert
                Hallo Nils,

                Rechnen im eScript habe ich auch schon mal benötigt.
                Ich habe dazu eine kommandozeilen-fähige calc.exe gefunden (siehe Anhang).
                Man kann das Ergebnis in eine .ini-Datei umleiten und z.B. per ReadIni einlesen.

                Das aber nur am Rande, falls Du mal kompliziertere Berechnungen machen musst.
                sin, cos, arctan etc. würde alles gehen. Wer's braucht.

                mfg
                Matthias
                • 5. Re: Rechnen in eScript
                  derniwi Master
                  Hallo Matthias,

                  mit der cmd.exe kann man ja auch rechnen, allerdings ist da bei großen Zahlen relativ schnell Schluss (32 Bit-Grenze). Da ich den freien Speicher von Byte in GB umrechnen wollte, ist das leider ausgeschieden... wie das dann mit anderen Kommandozeilentools aussieht, weiß ich nicht.

                  Daher dachte ich mir, ich nutze ein einfaches VB-Skript, da weiß ich zum einen wo es herkommt, zum anderen kann ich bei Problemen auch mal nachschauen.

                  Trotzdem Danke für den Tipp.

                  Gruß
                  Nils
                  • 6. Re: Rechnen in eScript
                    Ratzratz Expert
                    Hallo Nils,

                    mit der cmd.exe kann man rechnen !?!?
                    Also ohne Zusatz-Tool.

                    Wie geht das???


                    Gruß
                    Matthias
                    • 7. Re: Rechnen in eScript
                      derniwi Master
                      €Matthias: mit dem set-Befehl und dem Parameter "/a":
                      set /a a=3+7
                      set /a b=a+1
                      echo a= %a%
                      echo b= %b%


                      Hilfe hierzu liefert dir der Set-Befehl selbst.

                      Gruß
                      Nils

                      PS: man ist damit aber auf 32 Bit-Zahlen inkl. Vorzeichen, also effektiv auf 31 Bit-Werte beschränkt, also von -2.147.483.647 bis 2.147.483.648.
                      • 8. Re: Rechnen in eScript
                        Ratzratz Expert
                        Hallo Nils,

                        interessant. Man lernt nie aus.
                        Es gehen jedoch nur einfachste Operationen und auch nur mit ganzen Zahlen.

                        Ich habe das seinerzeit gebraucht, um die maximale Anzahl von Farben in einem bestimmten Videomodus unter Windows XP zu ermitteln.
                        Das geht mit der Formel Farbanzahl=2^Farbtiefe.
                        Den Potenzierungsoperator "^" kann man mit set /a jedoch nicht verwenden.
                        Somit war die Verwendung der kommandozeilen-fähigen calc.exe unvermeidbar.

                        Gruß
                        Matthias
                        • 9. Re: Rechnen in eScript
                          derniwi Master
                          Wie gesagt, das Problem ist halt auch, dass das Ergebnis im Rahmen bleiben muss. Oder man hat ein Tool, dass über die Registry oder über .ini-Dateien arbeitet.