这个问题不是很复杂,只是有点复杂,所以很难解释。我会尽量说清楚。
我下载了一个批处理文件,它允许您将文件夹拖到上面,它会设置一个新的文件夹图标。它通过创建 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 文件,但文件夹图标不会更改。
我希望我的问题很清楚。
我想到了。
正在写入的批处理文件将 desktop.ini 文件设置为系统和隐藏 (+S +H)。然后将文件夹本身设置为只读 (+R)。要使自定义 .ini 文件正常工作,该文件夹也必须设置为 system。
所以在改变这个之后:
对此:
一切正常!