Desktop.ini 資料夾圖示-批次檔-vba

Desktop.ini 資料夾圖示-批次檔-vba

這個問題並不是很複雜,只是有點複雜,很難解釋清楚。我會盡力盡可能清楚地表達。

我下載了一個批次文件,允許您將資料夾拖到上面,它將設置一個新的資料夾圖示。它透過建立desktop.ini 檔案並設定必要的檔案和資料夾屬性來實現此目的。

這是批次檔中的程式碼:

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  

儘管這可行,但我在末尾添加了一行來刷新資源管理器快取:

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

我想在 VBA 中以程式設計方式運行這個批次文件,所以我無法使用它的拖放功能。首先,我將所有“%1\”更改為“%~dp0\”,以便我可以讓 VBA 在任何資料夾中建立批次文件,並且它將使用該資料夾的路徑運行。

VBA 函數檢查客戶端餘額是否 >=0。如果是,用戶端資料夾將顯示一個綠色圖示。如果他負債了,就會出現一個紅色資料夾圖示。

VBA 函數將在客戶端資料夾中建立如前所示的 .bat 檔案並執行它。然後它將刪除 .bat 檔案。

這是 VBA 函數:

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   

問題是這樣的:

如果我手動將批次檔複製到客戶端資料夾並在那裡手動運行它,它就可以正常工作。 Desktop.ini 檔案已創建,大約 20 秒後,資料夾圖示發生變化。

但是,當 VBA 函數建立並執行相同的文件時,會建立 Desktop.ini 文件,但資料夾圖示不會變更。

我希望我的問題很清楚。

答案1

我想到了。

正在寫入的批次檔將desktop.ini 檔案設定為系統和隱藏(+S +H)。然後它將資料夾本身設定為唯讀(+R)。為了使自訂 .ini 檔案正常運作,該資料夾也必須設定為系統。

所以改變這個之後:

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

對此:

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

一切都很完美!

相關內容