A questão não é muito complicada, é apenas um pouco complexa, por isso é difícil de explicar. Farei o meu melhor para ser o mais claro possível.
Baixei um arquivo em lote que permite arrastar uma pasta para ele e definir um novo ícone de pasta. Isso é feito criando um arquivo desktop.ini e configurando os atributos de arquivo e pasta necessários.
Este é o código no arquivo em lote:
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
Mesmo que isso funcione, adicionei uma linha no final para atualizar o cache do Explorer:
start "C:\Windows\System32" ie4uinit.exe -show
Eu queria executar esse arquivo em lote programaticamente no VBA, então não pude usar a função arrastar e soltar dele. Então, primeiro, mudei todo o "%1\" para "%~dp0\" para que o VBA possa criar um arquivo em lote em qualquer pasta e ele seja executado usando o caminho dessa pasta.
A função VBA verifica se o saldo de um cliente é >=0. Se estiver, a pasta do cliente receberá um ícone verde. Se ele estiver endividado, aparecerá um ícone de pasta vermelho.
A função VBA criará o arquivo .bat conforme mostrado antes na pasta do cliente e o executará. Em seguida, ele excluirá o arquivo .bat.
Aqui está a função 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
Aqui está o problema:
Se eu copiar manualmente o arquivo em lote para uma pasta do cliente e executá-lo manualmente lá, ele funcionará bem. O arquivo desktop.ini é criado e após cerca de 20 segundos, o ícone da pasta muda.
Mas quando o mesmo arquivo é criado e executado pela função VBA, o arquivo desktop.ini é criado, mas o ícone da pasta não muda.
Espero que minha pergunta tenha sido clara.
Responder1
Eu descobri.
O arquivo em lote que está sendo gravado está configurando o arquivo desktop.ini como Sistema e Oculto (+S +H). Em seguida, ele está configurando a própria pasta como somente leitura (+R). Para que um arquivo .ini personalizado funcione, a pasta também deve ser definida como sistema.
Então, depois de mudar isso:
Print #fnum, "attrib +R %~dp0"
para isso:
Print #fnum, "attrib +R +S %~dp0"
tudo funciona perfeitamente!