ícone da pasta desktop.ini - arquivo em lote - vba

ícone da pasta desktop.ini - arquivo em lote - vba

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!

informação relacionada