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 函数创建并运行相同的文件时,会创建 desk.ini 文件,但文件夹图标不会改变。

我希望我的问题已经清楚了。

答案1

我想到了。

正在写入的批处理文件将desktop.ini文件设置为系统和隐藏(+S +H)。然后它将文件夹本身设置为只读(+R)。要使自定义.ini文件正常工作,还必须将文件夹设置为系统。

改变之后:

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

更改为:

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

一切都很完美!

相关内容