Füllen von Variablen innerhalb eines IF-Zweigs funktioniert nicht

  • VBScript

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Weisgarnix.

    Füllen von Variablen innerhalb eines IF-Zweigs funktioniert nicht

    Hallo zusammen,

    ich möchte innerhalb eines If-Zweiges den Inhalt einer Variablen
    "auseinandernehmen". Leider funktioniert das nicht und ich verstehe
    nicht, warum. Die Zielvariablen bleiben leer

    Hier mal mein Script:

    Visual Basic-Quellcode

    1. Option Explicit
    2. On Error Resume Next
    3. Dim objSysInfo, objShell, strRebootDate, strYear, strMonth, strDay, strHour, strMinute, messageBox
    4. Set objSysInfo = CreateObject("Microsoft.Update.SystemInfo")
    5. If (objSysInfo.RebootRequired) Then
    6. Set objShell = WScript.CreateObject("WScript.Shell")
    7. Set strRebootDate = objShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired\ForcedRebootTime")
    8. If Err.Number = 0 Then
    9. Err.Clear
    10. Set messageBox = MsgBox("Der Computer benötigt einen Neustart, um die Installation von wichtigen Sicherheitsupdates " & _
    11. "abschließen zu können. Starten Sie Ihren Computer in den nächsten 2 Tagen neu." & vbCrLf & _
    12. "Andernfalls wird der Computer nach spätestens 5 Tagen automatisch neu gestartet!" & vbCrLf & vbCrLf &_
    13. "Falls Sie Hilfe benötigen, kontaktieren Sie bitte den Helpdesk:" & vbCrLf & _
    14. "Tel.: (+49)1234 56789 oder E-Mail: servicedesk@beispiel-url.com" & Chr(13) & "" & Chr(13) & _
    15. "Ihre IT" & vbCrLf & vbCrLf &_
    16. "Your computer needs to be rebooted in order to finish the installation of critical security updates." & vbCrLf & _
    17. "Please reboot your computer within the next 2 days, otherwise it will automatically be rebooted then." & vbCrLf & vbCrLf &_
    18. "If you need help, please contact us:" & vbCrLf & _
    19. "Phone: (+49)1234 56789 or Mail: servicedesk@beispiel-url.com" & Chr(13) & "" & Chr(13) & _
    20. "Your IT", vbOkOnly + vbCritical, "Achtung: Neustart notwendig! - Attention: Reboot required")
    21. Else
    22. Err.Clear
    23. Set strYear = DatePart("yyyy", strRebootDate)
    24. Set strMonth = DatePart("m", strRebootDate)
    25. Set strDay = DatePart("d", strRebootDate)
    26. Set strHour = DatePart("h", strRebootDate)
    27. Set strMinute = DatePart("n", strRebootDate)
    28. Set messageBox = MsgBox("Der Computer benötigt einen Neustart, um die Installation von wichtigen Sicherheitsupdates " & _
    29. "abschließen zu können. Starten Sie Ihren Computer vor dem " & strDay & "." & strMonth & "." & strYear & " um " & strHour & " Uhr neu." & vbCrLf & _
    30. "Andernfalls wird der Computer am " & strDay & "." & strMonth & "." & strYear & " um " & strHour & ":" & strMinute & " Uhr automatisch neu gestartet!" & vbCrLf & vbCrLf &_
    31. "Falls Sie Hilfe benötigen, kontaktieren Sie bitte den Helpdesk:" & vbCrLf & _
    32. "Tel.: (+49)1234 56789 oder E-Mail: servicedesk@beispiel-url.com" & Chr(13) & "" & Chr(13) & _
    33. "Ihre IT" & vbCrLf & vbCrLf &_
    34. "Your computer needs to be rebooted in order to finish the installation of critical security updates." & vbCrLf & _
    35. "Please reboot your computer before " & strRebootDate & ", otherwise it will automatically be rebooted then." & vbCrLf & vbCrLf &_
    36. "If you need help, please contact us:" & vbCrLf & _
    37. "Phone: (+49)1234 56789 or Mail: servicedesk@beispiel-url.com" & Chr(13) & "" & Chr(13) & _
    38. "Your IT", vbOkOnly + vbCritical, "Achtung: Neustart notwendig! - Attention: Reboot required")
    39. End If
    40. End If


    Die Messagebox kommt, mit theoretisch den einzelnen String-Anteilen bezüglich der Daten.
    Tatsächlich bleiben die Stringvariablen aber leer und der Inhalt der Messagebox an der Stelle ohne Sinn. Hat jemand eine Idee, woran das liegen könnte? Bin über jede Hilfe dankbar, da ich nicht wirklich nachvollziehen kann, warum das so ist.

    Nachtrag: Falls jemand testen möchte, kann er die angehängten Reg-Dateien importieren, NACHDEM er sich die Schreibrechte für den Registry-Zweig an dieser Stelle gegeben hat. Wichtig: Nur, wer weiß, was er da tut, sollte die Berechtigungen an seiner Registry für den Test anpassen und hinterher wieder rückgängig machen! Alternativ kann man auch die Windows-Updates installieren, aber noch nicht rebooten.
    Dateien
    • Registry.7z

      (449 Byte, 58 mal heruntergeladen, zuletzt: )
    Hi Neptun und alle,

    habe nun die Set-Befehle rausgenommen.
    Es sieht etwas besser aus, aber nicht viel:



    Eigentlich steht ein anderes Datum an entsprechender Stelle in der Registry:



    Hat jemand eine Idee, warum der String nicht funktioniert? Scheint fast so, als ob das Auslesen nicht funktioniert und das DatePart dann einen Initialwert verwendet anstelle der Rückgabe aus dem RegRead.
    Der Tipp, das Set wegzulassen, ist sehr irreführend. Vor allem, weil es nicht eines gibt, und die Formulierung dazu animiert, jegliche "Set"s zu entfernen, was genauso falsch wäre.

    Einer der größeren Nachteile von VB (vor .NET) und VBScript ist/war, dass man bei Zuweisungen genau wissen musste, ob man es mit einem Werttyp oder einem Objektverweis zu tun hat. Objektverweise müssen mit Set einer Objektvariablen zugewiesen werden, Werte jedoch nicht. Und dass Strings und Datumsangaben Werttypen sind.

    Sinnigerweise hast du bei den Namen der Variablen schon korrekt erkannt, was Objekt und was etwas anderes ist, und genau da musst du unterscheiden, ob du Set angeben musst (objSysInfo, objShell) oder eben nicht.

    Danach sollte es eigentlich funktionieren, denn auf den ersten Blick habe ich kein weiteres offenkundiges Problem ausmachen können.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Hi zusammen,

    wenn ich jetzt noch den richtigen Code im richtigen THEN / ELSE - Zweig habe, funktioniert es! Vielen Dank euch beiden!
    Set bei Objekten, bei einfachen Variablentypen wie Booleans, strings, integers etc. nicht. Einfache Regel - wenn mans weiß.
    Danke nochmals!

    Hier für alle nun der fertige Quellcode:

    Visual Basic-Quellcode

    1. Option Explicit
    2. On Error Resume Next
    3. Dim objSysInfo, objShell, strRebootDate, strYear, strMonth, strDay, strHour, strMinute, messageBox
    4. Set objSysInfo = CreateObject("Microsoft.Update.SystemInfo")
    5. If (objSysInfo.RebootRequired) Then
    6. Set objShell = WScript.CreateObject("WScript.Shell")
    7. strRebootDate = objShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired\ForcedRebootTime")
    8. If Err.Number = 0 Then
    9. Err.Clear
    10. strYear = DatePart("yyyy", strRebootDate)
    11. strMonth = DatePart("m", strRebootDate)
    12. strDay = DatePart("d", strRebootDate)
    13. strHour = DatePart("h", strRebootDate)
    14. strMinute = DatePart("n", strRebootDate)
    15. messageBox = MsgBox("Der Computer benötigt einen Neustart, um die Installation von wichtigen Sicherheitsupdates " & _
    16. "abschließen zu können. Starten Sie Ihren Computer vor dem " & strDay & "." & strMonth & "." & strYear & " um " & strHour & " Uhr neu." & vbCrLf & _
    17. "Andernfalls wird der Computer am " & strDay & "." & strMonth & "." & strYear & " um " & strHour & ":" & strMinute & " Uhr automatisch neu gestartet!" & vbCrLf & vbCrLf &_
    18. "Falls Sie Hilfe benötigen, kontaktieren Sie bitte den Helpdesk:" & vbCrLf & _
    19. "Tel.: (+49)1234 56789 oder E-Mail: servicedesk@beispiel-url.com" & Chr(13) & "" & Chr(13) & _
    20. "Ihre IT" & vbCrLf & vbCrLf &_
    21. "Your computer needs to be rebooted in order to finish the installation of critical security updates." & vbCrLf & _
    22. "Please reboot your computer before " & strRebootDate & ", otherwise it will automatically be rebooted then." & vbCrLf & vbCrLf &_
    23. "If you need help, please contact us:" & vbCrLf & _
    24. "Phone: (+49)1234 56789 or Mail: servicedesk@beispiel-url.com" & Chr(13) & "" & Chr(13) & _
    25. "Your IT", vbOkOnly + vbCritical, "Achtung: Neustart notwendig! - Attention: Reboot required")
    26. Else
    27. Err.Clear
    28. messageBox = MsgBox("Der Computer benötigt einen Neustart, um die Installation von wichtigen Sicherheitsupdates " & _
    29. "abschließen zu können. Starten Sie Ihren Computer in den nächsten 2 Tagen neu." & vbCrLf & _
    30. "Andernfalls wird der Computer nach spätestens 5 Tagen automatisch neu gestartet!" & vbCrLf & vbCrLf &_
    31. "Falls Sie Hilfe benötigen, kontaktieren Sie bitte den Helpdesk:" & vbCrLf & _
    32. "Tel.: (+49)1234 56789 oder E-Mail: servicedesk@beispiel-url.com" & Chr(13) & "" & Chr(13) & _
    33. "Ihre IT" & vbCrLf & vbCrLf &_
    34. "Your computer needs to be rebooted in order to finish the installation of critical security updates." & vbCrLf & _
    35. "Please reboot your computer within the next 2 days, otherwise it will automatically be rebooted then." & vbCrLf & vbCrLf &_
    36. "If you need help, please contact us:" & vbCrLf & _
    37. "Phone: (+49)1234 56789 or Mail: servicedesk@beispiel-url.com" & Chr(13) & "" & Chr(13) & _
    38. "Your IT", vbOkOnly + vbCritical, "Achtung: Neustart notwendig! - Attention: Reboot required")
    39. End If
    40. End If