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 かどうかをチェックします。残高が 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"

すべて完璧に動作します!

関連情報