1 2 Previous Next 15 Replies Latest reply on Apr 26, 2017 6:07 AM by derniwi

    Frage zu dem Befehl "Set"

    SitzRieSe Expert
      Hi Zusammen,

      ich hab mal eine etwas spezieller Frage.. In der DSM 2016.2 hab ich im "Determin Main User" Paket gesehen das dort Variablen über den Set Befehl zusammen gebaut wurden. Zum Beispiel so:

      Set('CurrentTime','%[time.parse(''%time.system%'')]%')



      Ich möchte jetzt in einer anderen Umgebung 2016.1 etwas ähnliches tun. Dort versuche ich grade:

      !Create system date variable
      Set('systemdate','%[%date:~0,2%%date:~3,2%%date:~6,4%]%')
      !
      !Prepare fileshare
      MakeDir('%InstallationParameters.NetworkPath%\%computername%\%systemdate%\')/TS



      Ziel ist ein Datum zu generieren welches keine Sonderzeichen enthält. Klar könnte ich soetwas auch über Umwege lösen, aber schön wäre es wenn ich das nativ im eScript gelöst bekomme...

      Leider löst er mir aber die Variable überhaupt nicht auf... Er schreibt im Log: "Fehler beim Anlegen des Verzeichnisses \\\Bitlocker$\\%[%date:~0,2%%date:~3,2%%date:~6,4%]%"

      Kann mir einer helfen wie man das richtig benutzt? Oder geht das erst in der 2016.2?

      Danke!

      Gruß

      Alex
        • 1. Re: Frage zu dem Befehl "Set"
          derniwi Master
          Hallo Alex,

          mit diesem Parse habe ich mich noch nicht wirklich auseinandergesetzt. Da ich aber auch schon Datum und Uhrzeit gebraucht habe, nutze ich eine WMI-Abfrage, siehe [URL="http://forum.enteo.com/showthread.php?t=15121"]hier.

          Bei den Umgebungsvariablen kann es halt zu Problemen kommen, wenn Benutzer eine englische Darstellung verwenden. Oder wenn ein Monat nur eine Stelle verwendet und keine führende Null bekommt, bzw. dann etwas wie "4/26/2017" anstelle von "26.04.2017" steht.

          Gruß
          Nils
          • 2. Re: Frage zu dem Befehl "Set"
            _Mel_ Master
            um irgendwelche teilstrings abzufragen gibt's in escript befehle (StrLeft, StrMid, StrRight)

            um das innerhalb von variablen zu machen
            geht auch
            %[~string.left(2):%[variable]%~]%
            %[~string.mid(2,3):%[variable]%~]%
            %[~string.right(4):%[variable]%~]%
            • 3. Re: Frage zu dem Befehl "Set"
              derniwi Master
              Danke Mel.
              Wieder etwas gelernt.

              Damit wäre dann der Set-Befehl folgender:
              Set('systemdate','%[~string.left(2):%[date]%~]%%[~string.mid(3,2):%[date]%~]%%[~string.right(4):%[date]%~]%')


              Wobei mir für Verzeichnisse ja die umgekehrte Reihenfolge lieber ist, also Jahr-Monat-Tag. Klappt besser mit dem Sortieren.
              • 4. Re: Frage zu dem Befehl "Set"
                SitzRieSe Expert
                Coolio, das flutscht! Danke euch
                • 5. Re: Frage zu dem Befehl "Set"
                  Ratzratz Expert
                  Hallo Zusammen,

                  1.) Ist diese merkwürdige Schreibweise mit
                  %[~string.left(2):%[date]%~]% ...
                  d.h. mit dieser Tilde etc. irgendwo dokumentiert?

                  2.) Warum verwendet man nicht einfach
                  StrReplace('%date%','.','','_systemdate')

                  Das Ergebnis scheint dasselbe zu sein.

                  Gruß
                  Matthias
                  • 6. Re: Frage zu dem Befehl "Set"
                    _Mel_ Master
                    steht in der hilfe unter "resolution of variables"

                    das eigentliche problem mit der %date% variable ist, daß sie entsprechend der landeseinstellungen formatiert ist, d.h. unterschiedliche trennzeichen, unterschiedliche reihenfolge der werte.
                    darum würde ich in einem aktuellen system, wenn's nicht gerade darum geht einen text zum anzeigen zu haben eher %time.system% benutzen, denn das ist immer ISO 8601
                    • 7. Re: Frage zu dem Befehl "Set"
                      derniwi Master
                      Hallo,

                      ich finde in der englischen Hilfe (dsm.chm) nur den Abschnitt:
                      Resolution of Logical Expressions in Variables
                      für logische Ausdrücke, aber die Syntax oder ein Übersicht für Funktionen wie
                      string.left(2)
                      finde ich leider nicht.

                      Die Hilfe gehört zu DSM Release 2016.2

                      Gruß
                      Nils
                      • 8. Re: Frage zu dem Befehl "Set"
                        Ratzratz Expert
                        Hallo Zusammen,

                        zu 1.) In der DSM.chm findet man es, wenn man nach "Auflösung von Variablen" sucht.

                        zu 2.) Das mit dem Länderformat leuchtet mir ein.
                        Das war bei uns nie ein Thema, da wir immer TT.MM.JJJJ verwenden.

                        Gruß und danke
                        Matthias
                        • 9. Re: Frage zu dem Befehl "Set"
                          _Mel_ Master
                          also die eckigen klammern und die tilde fildest du unter "resolution of variables" (überschrift "Using Brackets with Variables")

                          string.left wird im windows 10 os config template verwendet, ist aber nicht dokumentiert
                          • 10. Re: Frage zu dem Befehl "Set"
                            derniwi Master
                            @Mel: ok, "nicht Dokumentiert" trifft es dann.

                            Dass mit den eckigen Klammern habe ich schon gesehen, ob es andere Funktinoen wie "string.left" gibt, weiß man also nicht... schade eigentlich...
                            • 11. Re: Frage zu dem Befehl "Set"
                              _Mel_ Master
                              solche sachen sind oft keine eigenständigen features, sondern für andere sachen gebraucht (in dem fall das osd template). daher haben die für den dokuschreiber dann eher geringe prio (zumal die oft auch aufwändiger zu erklären sind)

                              aber falls es jemand interessiert - hier sind ein paar beispiele

                              %[string.mid(-6):%hexsmall%]%
                              %[string.mid(0, 4):%numbers%]%
                              %[~string.right(3):%numbers%~error]%
                              %[~string.right(-3):%numbers%~error]%
                              %[~string.left( -2 - 1 ):%numbers%~error]%
                              %[~string.trimright('DEF'):%hexbig%~error]%
                              %[~string.trimleft('120'):%incdec%~error]%
                              %[~string.trim('120'):%incdec%~error]%
                              %[~string.replace('4567', 'xyz'):%numbers%~error]%
                              %[~reg.value64('HKEY_LOCAL_MACHINE\\SOFTWARE\\___Test', 'int')~error]%
                              %[~reg.value64('HKEY_LOCAL_MACHINE\\SOFTWARE\\___Test', 'string')~error]%
                              %[~reg.value64('HKEY_LOCAL_MACHINE\\SOFTWARE\\___Test', '')~error]%
                              %time.system%
                              %[Time.Parse('1970-01-01T00:00:00Z')]%
                              %[Time.ToString(0 + 60 * 60)]%

                              - in escript würde ich eher die doppelten anführungszeichen (") nehmen anstatt die einfachen ('), weil die nicht mit der escript syntax kollidieren
                              - man sieht, daß die "parameter" auch mathematische ausdrücke enthalten können
                              - reg.value32 gibt's auch
                              • 12. Re: Frage zu dem Befehl "Set"
                                derniwi Master
                                Danke, Mel.

                                Naja, durch die Verwendung der dokumentierten mathematischen Ausdrücke konnte ich ein Skript schon wesentlich verkürzen. Und am Ende wird es dann auch schneller. Wenn man keine Multiplikation hat, wird es ja eh doof. Entweder über eine Schleife addieren oder ein externes Skript verwenden. Letzteres hatte ich dazu mal gebaut: einen einfachen Rechner, müsste auch hier im Forum zu finden sein.

                                Aber etwas Kommentieren und dann Funktionen nutzen (wenngleich die Verwendung nicht besonders leserlich ist) hilft letztlich dann doch, vor allem bzgl. der Laufzeit.

                                Weißt du, was "~error" bedeutet?

                                Soweit ich das jetzt interpretiere, wird eine Funktion für die Vernwedung innerhalb einer Variablen so aufgerufen:
                                %[~Funktion(Parameter):%Bezugsvariable%~]%


                                Und bei "string.right" scheint es egal zu sein, ob da "3" oder "-3" angegeben wird. Zugegeben, "-3 " macht keinen Sinn. Und wenn auch nur zwei Zeichen vorhanden sind, werden nur zwei genutzt.
                                • 13. Re: Frage zu dem Befehl "Set"
                                  _Mel_ Master
                                  naja, %[= 8 * 3]% ist jetzt auch nicht schlimmer als eine formel in excel
                                  und solche erweiterungen müssen halt immer so gemacht werden, daß möglichst keine existierenden scripte beeinträchtigt werden

                                  die tilde ist zum abfangen von nicht definierten variablen

                                  z.B. würde
                                  %CurrentComputer.Var.MyVarGroup.MyVarname%
                                  wenn die variable für den computer nicht gesetzt ist unverändert übernommen, d.h. wenn man sie etwa einem programm als parameter übergibt, dann bekommt das programm als parameter %CurrentComputer.Var.MyVarGroup.MyVarname%

                                  wenn man aber schreibt
                                  %[~CurrentComputer.Var.MyVarGroup.MyVarname~default]%
                                  dann wird im fehlerfall die variable zu "default" aufgelöst
                                  anstelle von "default" kann da beliebiges stehen, eben auch "error" oder "1234" oder was man halt benutzen will, wenn die variable nicht gesetzt ist.
                                  bei %[~CurrentComputer.Var.MyVarGroup.MyVarname~]% ist der default dann halt ein leerer text
                                  ist gerade auch interessant bei den registryabfragen, wenn man nicht sicher sein kann, daß der wert existiert

                                  du kannst also auch ohne tilde schreiben
                                  %[Funktion(Parameter):%Bezugsvariable%]%
                                  dann kommt im fehlerfall halt ein nicht so hübscher text raus

                                  die geschachtelten variablen kann man übrigens fast überall verwenden.
                                  man kann also z.B. schreiben
                                  %[String.Mid( %[index]% ,1):0123456789ABCDEF]%
                                  um eine zahl zwischen 0 und 15 in den entsprechenden hex wert umzuwandeln

                                  oder %[= 8 %[op]% 3]% wenn man feste operanden und einen variablen operator haben will


                                  negative zahlen bedeuten normalerweise, daß der index von der anderen seite gezählt wird
                                  also %[String.Left(-2):langeswort]% bringt wahrscheinlich sowas wie "langeswo" (müßte ich jetzt auch ausprobieren)
                                  %[String.Right(-2):langeswort]% müßte dannn "ngeswort" oder so sein
                                  • 14. Re: Frage zu dem Befehl "Set"
                                    derniwi Master

                                    naja, %[= 8 * 3]% ist jetzt auch nicht schlimmer als eine formel in excel
                                    und solche erweiterungen müssen halt immer so gemacht werden, daß möglichst keine existierenden scripte beeinträchtigt werden



                                    Das stimmt natürlich. Aber wenn dann Variablen dazu kommen, kann das schnell ausarten:
                                    Set('_WMIDate','')
                                    WMISimpleQuery('\\.\root\cimv2','Win32_CurrentTime','__CLASS=Win32_LocalTime','_WMIDate')
                                    __CLASS
                                    Hour
                                    Minute
                                    Second
                                    EndProc
                                    Set('currentTimeSecs','%[=(%_WMIDateHour% * 60 + %_WMIDateMinute%) * 60 + %_WMIDateSecond%]%')


                                    die tilde ist zum abfangen von nicht definierten variablen
                                    z.B. würde
                                    %CurrentComputer.Var.MyVarGroup.MyVarname%
                                    wenn die variable für den computer nicht gesetzt ist unverändert übernommen, d.h. wenn man sie etwa einem programm als parameter übergibt, dann bekommt das programm als parameter %CurrentComputer.Var.MyVarGroup.MyVarname%


                                    Aha. Ja, das ist ok. Somit kann man einen Default-Wert definieren.

                                    du kannst also auch ohne tilde schreiben
                                    %[Funktion(Parameter):%Bezugsvariable%]%
                                    dann kommt im fehlerfall halt ein nicht so hübscher text raus


                                    Ja, verstehe.

                                    negative zahlen bedeuten normalerweise, daß der index von der anderen seite gezählt wird
                                    also %[String.Left(-2):langeswort]% bringt wahrscheinlich sowas wie "langeswo" (müßte ich jetzt auch ausprobieren)
                                    %[String.Right(-2):langeswort]% müßte dannn "ngeswort" oder so sein


                                    Bei meinem Test hatte ich mit 3 und mit -3 getestet, hatte aber eine Variable, die 6 Zeichen lang war... Zufall oder Pech... wie auch immer.
                                    Aber das von dir genannte Verhalten kann ich bestätigen (hatte das vor vielen Jahren manchmal in div. Programmiersprachen vermisst):
                                      string.right(positive Zahl n): gibt die mit n (maximal) angegebene Anzahl der Stellen vom Ende der Zeichenkette zurück
                                      string.right(negative Zahl n): schneidet am Anfang Betrag n Zeichen ab und gibt den Rest der Zeichenkette zurück

                                    Test:
                                    Set('numbers','1234567890')
                                    Set('numbers2','%[string.right(3):%numbers%]%')
                                    Set('numbers3','%[string.right(-3):%numbers%]%')
                                    MsgBox
                                    numbers: %numbers%
                                    numbers2: %numbers2%
                                    numbers3: %numbers3%
                                    EndProc


                                    Ausgabe:
                                    numbers: 1234567890
                                    number2: 890
                                    numbers3: 4567890

                                    Damit ist klar, dass bei string.right(3) und string.right(-3) bei sechs Zeichen das Ergebnis gleich ist...
                                    1 2 Previous Next