iconcache.db per VBS löschen

  • VBScript

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

    iconcache.db per VBS löschen

    Hallo Zusammen,

    Nach etlichen Versuchen schaffe ich es einfach nicht, die "IconCache.db" per VBS zu löschen. Als Batch funktioniert es dagegen problemlos.
    Doch mein Script meldet mir permanent, die Datei würde nicht existieren bzw. er könne die Datei nicht finden.

    Muss ich dem Script evtl. vorher sagen, er solle versteckte Dateien sichtbar machen und diese berücksichtigen?

    Und so siehts aus:

    Visual Basic-Quellcode

    1. DIM strComputer, objWMIService, colProcessList, fso, fsofile, strUser, wsh
    2. strComputer = "."
    3. Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    4. Set colProcessList = objWMIService.ExecQuery ("Select * from Win32_Process Where Name = 'explorer.exe'")
    5. For Each objProcess in colProcessList
    6. objProcess.Terminate()
    7. Next
    8. strUser = userprofile
    9. set fso = CreateObject("Scripting.FileSystemObject")
    10. Set fsofile = fso.GetFile("C:\Users\" & strUser & "\AppData\Local\IconCache.db")
    11. fsofile.DeleteFile "C:\Users\" & strUser & "\AppData\Local\IconCache.db", true
    12. Set wsh = WScript.CreateObject ("WScript.Shell")
    13. wsh.run """C:\Windows\explorer.exe"""
    14. WScript.Quit



    Gruß p41n
    Wo bekommt er userprofil her?

    Ich kenne diese Methode:

    Visual Basic-Quellcode

    1. DIM strUser, varNET
    2. Set varNet = CreateObject("WScript.Network")
    3. strUser= varNet.UserName
    4. msgbox strUser
    5. WScript.Quit


    Für Anfänger sei gesagt, dass dein Code den Explorer abschießt. Mit all den Folgen, welche da lauern. Also nicht einfach blind kopieren und ausführen.

    Den Iconcache lösche ich aber nie. Hast du Probleme mit falsch angezeigten Icons?
    Gruß
    Peterfido

    Keine Unterstützung per PN!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „peterfido“ ()

    Prima. Danke für deine Hilfe! Nun funktioniert es so, wie es sein soll! :)

    Zum "Userprofil" sei gesagt, dass dies nur ein Platzhalter sein sollte.
    In meinem eigentlichen Script habe ich natürlich den tatsächlichen angemeldeten Usernamen eingefügt.
    Hier im Forum wollte ich nur den Platzhalter angeben. Das war also volle Absicht.

    Doch, wenn ich im eigentlichen Script meinen Usernamen verwendete, brachte er die Meldung, er könne die Datei nicht finden.
    Aber jetzt mit deiner Methode klapperts.. :thumbsup:

    Der eigentliche Sinn des Scriptes liegt darin, wie Du bereits schon festgestellt hast, den Iconcache zu löschen, wenn die Iconsymbole nicht mehr korrekt angezeigt werden. Ich habe das vorher immer per Batch gelöst.

    CD /d %userprofile%\AppData\Local
    DEL IconCache.db /a
    start explorer.exe
    exit

    Nun wollte ich daraus aber ein VBScript basteln, weil die Batch zu umständlich ist. Dagegen ist ein VBScript schneller und einfacher, wenn es denn funktioniert. Und nun funktioniert es. :)

    Für die Anfänger habe ich nun das Script mit Kommentaren versehen. Denn, um den Iconcache zu löschen, müssen vorher sämtliche Explorer.exe Prozesse gekillt werden. Allerdings wird nur der Explorer beendet. Alle anderen Prozesse bleiben unberührt. Also, wenn nun ein Browser, Outlook oder eine andere Anwendung offen sein sollte, macht das nichts. Nach dem Start der Explorer.exe ist wieder alles wie vorher. Es werden also keine weiteren Prozesse gekillt.

    Visual Basic-Quellcode

    1. 'Löschen des Iconcache, wenn Iconsymbole nicht mehr korrekt angezeigt werden!
    2. 'Schritt 1: Sämtliche Prozesse "Explorer.exe" werden per WMI-Abfrage beendet
    3. 'Schritt 2: Zuerst wird der gerade angemeldete Benutzer ermittelt und danach wird die IconCache.db gelöscht
    4. 'Schritt 3: Neustart des Prozesses "Explorer.exe"
    5. On Error Resume Next
    6. 'Variablendeklarierung
    7. DIM strComputer, objWMIService, colProcessList, varNET, strUser, fso, wsh
    8. 'WMI-Abfrage des lokalen Computers nach dem Prozess "explorer.exe"
    9. strComputer = "."
    10. Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    11. Set colProcessList = objWMIService.ExecQuery ("Select * from Win32_Process Where Name = 'explorer.exe'")
    12. 'Sämtliche Explorer.exe-Prozesse des lokalen Computers werden beendet
    13. For Each objProcess in colProcessList
    14. objProcess.Terminate()
    15. Next
    16. 'Ermitteln des gerade angemeldeten Benutzers
    17. Set varNet = CreateObject("WScript.Network")
    18. strUser= varNet.UserName
    19. 'Löschen der "Iconcache.db"
    20. set fso = CreateObject("Scripting.FileSystemObject")
    21. fso.DeleteFile "C:\Users\" & strUser & "\AppData\Local\IconCache.db", true
    22. 'Der Prozess "explorer.exe" wird neu gestartet
    23. Set wsh = WScript.CreateObject ("WScript.Shell")
    24. wsh.run """C:\Windows\explorer.exe"""
    25. 'Script wird beendet
    26. WScript.Quit



    Gruß p41n
    Mit den Nachteilen meinte ich, dass z.B. einige Symbole im Systray fehlen können. Auch weiß ich nicht, was passiert, wenn der Explorer gerade mit verschieben / kopieren beschäftigt ist.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Im Systray fehlen hinterher keine Symbole. Habe ich mehrmals an meinem und anderen Rechnern erfolgreich getestet. Wenn doch, zur Not einfach abmelden und wieder anmelden. Das System wird dadurch jedenfalls nicht zerschossen. Der Kopiervorgang wird dagegen natürlich beendet. Allerdings ist auch das kein Beinbruch. Nur sollte man schon so schlau sein, das Script nicht auszuführen, wenn man gerade etwas kopiert/verschiebt.. ;) Aber auch das zerschießt/zerstört oder beeinträchtigt nicht das System. Falls doch hinterher etwas nicht so laufen sollte, wie es vorher war, einfach einen Reboot durchführen und gut ist. Das Script kann also bedenkenlos eingesetzt werden. :)

    Ich habe das Script gerade eben im Hintergrund ausgeführt, als ich mehrere Brwoserfenster und Applikationen geöffnet hatte und kann hier nun problemlos weiterschreiben, ohne etwas neustarten zu müssen.

    Nichts desto trotz habe ich das Script nochmal überarbeitet. Nun wird vorher geprüft, ob die Datei überhaupt existiert. Falls nicht, wird das Script direkt beendet. Erst, wenn die Datei existiert, wird der Explorer beendet, die Datei gelöscht und der Explorer wieder gestartet.

    Visual Basic-Quellcode

    1. 'Löschen des Iconcache, wenn Iconsymbole nicht mehr korrekt angezeigt werden!
    2. 'Schritt 1: Der gerade angemeldete Benutzer wird ermittelt
    3. 'Schritt 2: Der Pfad zur IconCache.db wird festgesetzt
    4. 'Schritt 3: Prüfung, ob IconCache.db vorhanden
    5. 'Schritt 4: wenn positiv, Explorer.exe wird beendet; anschließend Löschung --> wenn negativ, Scriptende
    6. On Error Resume Next
    7. 'Variablendeklarierung
    8. DIM strComputer, objWMIService, colProcessList, varNET, strUser, fso, wsh, strPath1, strPath2
    9. 'Ermitteln des gerade angemeldeten Benutzers
    10. Set varNet = CreateObject("WScript.Network")
    11. strUser= varNet.UserName
    12. 'Pfad zur IconCache.db
    13. strPath1 = "C:\Users\"
    14. strPath2 = "\AppData\Local\IconCache.db"
    15. 'Prüfung, ob IconCache.db existiert
    16. set fso = CreateObject("Scripting.FileSystemObject")
    17. If fso.FileExists(strPath1 & strUser & strPath2) Then
    18. 'Definition des lokalen Computers in einer Variablen
    19. strComputer = "."
    20. 'WMI-Abfrage --> Prozess "explorer.exe"
    21. Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    22. Set colProcessList = objWMIService.ExecQuery ("Select * from Win32_Process Where Name = 'explorer.exe'")
    23. 'Sämtliche Explorer.exe-Prozesse werden beendet
    24. For Each objProcess in colProcessList
    25. objProcess.Terminate()
    26. Next
    27. 'Löschen der "Iconcache.db"
    28. fso.DeleteFile strPath1 & strUser & strPath2, true
    29. 'Ende der If.. Then Schleife
    30. End If
    31. 'Script wird beendet
    32. WScript.Quit


    Gruß p41n