Ordnersymbol „desktop.ini“ – Batchdatei – VBA

Ordnersymbol „desktop.ini“ – Batchdatei – VBA

Das Problem ist nicht sehr kompliziert, es ist nur ein wenig komplex und daher schwer zu erklären. Ich werde mein Bestes tun, um es so klar wie möglich auszudrücken.

Ich habe eine Batchdatei heruntergeladen, mit der Sie einen Ordner darauf ziehen können und ein neues Ordnersymbol festlegen. Dies geschieht durch Erstellen einer desktop.ini-Datei und Festlegen der erforderlichen Datei- und Ordnerattribute.

Dies ist der Code in der Batchdatei:

If [%1] == [] goto :eof  
ECHO [.ShellClassInfo] >%1\desktop.in  
ECHO IconResource=J:\PRESETS\AUTOHOTKEY SCRIPTS\VSA\ICONS\GREEN\folderico-green.ico,0 >>%1\desktop.in  
move %1\desktop.in %1\desktop.ini  
attrib +S +H %1\desktop.ini  
attrib +R %1  

Obwohl dies funktioniert, habe ich am Ende eine Zeile hinzugefügt, um den Explorer-Cache zu aktualisieren:

start "C:\Windows\System32" ie4uinit.exe -show  

Ich wollte diese Batchdatei programmgesteuert in VBA ausführen, daher konnte ich die Drag-and-Drop-Funktion nicht verwenden. Also habe ich zunächst alle "%1\" in "%~dp0\" geändert, damit VBA eine Batchdatei in einem beliebigen Ordner erstellen kann und sie unter dem Pfad dieses Ordners ausgeführt wird.

Die VBA-Funktion prüft, ob der Kontostand eines Kunden >=0 ist. Wenn dies der Fall ist, erhält der Kundenordner ein grünes Symbol. Wenn der Kunde Schulden hat, wird ein rotes Ordnersymbol angezeigt.

Die VBA-Funktion erstellt die .bat-Datei wie zuvor gezeigt im Client-Ordner und führt sie aus. Anschließend wird die .bat-Datei gelöscht.

Hier ist die VBA-Funktion:

Sub ChangeClientFolderIcon(ByVal ClientName As String, ByVal TotalALL As Currency)  

Dim substrings() As String  
Dim NewClientName As String  
substrings = Split(ClientName)  

NewClientName = substrings(2) & "_" & substrings(0) & "_" & substrings(1)  

Dim fso As New FileSystemObject  
Dim f As Folder, sf As Folder  

    Set f = fso.GetFolder("M:\DIGITAL_ALBUMS\")  
    For Each sf In f.SubFolders  

           If sf.name = NewClientName Then  

                Dim MyFile As Variant  
                Dim fnum As Variant  

                MyFile = sf & "\cmdcode.bat"  
                fnum = FreeFile()  
                Open MyFile For Output As #fnum  

                    If TotalALL >= 0 Then    

                        Print #fnum, "If [%~dp0] == [] goto :eof"  
                        Print #fnum, "ECHO [.ShellClassInfo] >%~dp0\desktop.in"  

                    If TotalALL >= 0 Then  
                        Print #fnum, "ECHO IconResource=J:\PRESETS\AUTOHOTKEY SCRIPTS\VSA\ICONS\GREEN\folderico-green.ico,0 >>%~dp0\desktop.in"  
                    Else    
                        Print #fnum, "ECHO IconResource=J:\PRESETS\AUTOHOTKEY SCRIPTS\VSA\ICONS\RED\folderico-red.ico,0 >>%~dp0\desktop.in"  
                    End If  

                    Print #fnum, "move %~dp0\desktop.in %~dp0\desktop.ini"  
                    Print #fnum, "attrib +S +H %~dp0\desktop.ini"  
                    Print #fnum, "attrib +R %~dp0"  
                    Print #fnum, "start ""C:\Windows\System32"" ie4uinit.exe -show"  

                Close #fnum  

                ' Run bat-file:  
                Shell MyFile, vbNormalFocus  

                ' optional, remove bat-file:  

                'Sleep for 5 seconds  
                Application.Wait (Now + TimeValue("0:00:05"))  
                Kill sf & "\cmdcode.bat"  

                Exit For  
          End If  
    Next  
End Sub   

Hier ist das Problem:

Wenn ich die Batchdatei manuell in einen Client-Ordner kopiere und dort manuell ausführe, funktioniert es einwandfrei. Die Datei desktop.ini wird erstellt und nach etwa 20 Sekunden ändert sich das Ordnersymbol.

Wenn jedoch dieselbe Datei erstellt und von der VBA-Funktion ausgeführt wird, wird die Datei desktop.ini erstellt, das Ordnersymbol ändert sich jedoch nicht.

Ich hoffe, meine Frage war klar.

Antwort1

Ich habe es herausgefunden.

Die Batchdatei, die geschrieben wird, setzt die Datei desktop.ini auf System und Versteckt (+S +H). Dann setzt sie den Ordner selbst auf schreibgeschützt (+R). Damit eine benutzerdefinierte INI-Datei funktioniert, muss der Ordner ebenfalls auf System gesetzt werden.

Nachdem ich dies geändert habe:

Print #fnum, "attrib +R %~dp0"

dazu:

Print #fnum, "attrib +R +S %~dp0"

alles funktioniert einwandfrei!

verwandte Informationen