Измените значок папки с помощью специального меню, вызываемого правой кнопкой мыши.

Я пытаюсь создать собственное меню, вызываемое правой кнопкой мыши, которое позволяет мне установить собственный значок папки, используя что угодно.folder.icoЯ положил в эту папку.

Мой путь на данный момент:

Иметь контекстное меню по папкам, в котором запускается командный файл (сделано благодаря этой теме ):

      Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\set_folder_icon]
@="Set folder icon"

[HKEY_CLASSES_ROOT\Directory\shell\set_folder_icon\command]
@="\"C:\\path\\set_folder_icon.bat\" \"%1\""

Что касается bat-файла, мне не удается заставить его работать. Боюсь, это потому, что я не могу заставить его выбрать папку, на которой я щелкаю правой кнопкой мыши.

Я основывал свою работу на этой теме :

      rem @echo off
set O=desktop.old
set F=desktop.ini
FOR /R %%I IN (*.ico) DO @(
cd%%~pI 
if exist %%~dpnfolder.ico (
echo %%~dpnfolder.ico
attrib -h -s %F% 
copy /Y %F% %O%
echo [.ShellClassInfo] > %F%
echo IconResource=folder.ico,0 >> %F%
echo [ViewState] >> %F%
echo Mode= >> %F%
echo Vid= >> %F%
echo FolderType=Generic >> %F%
attrib +h +s %F% 
)
)
pause

Я хотел бы просто проверить, существует лиfolder.ico, отредактировать Desktop.ini или создать его полностью, если он не существует (я не знаю, может ли это сделать текущая бита), и в идеале (но не обязательно) нет отредактируйте другие параметры, которые могут быть там уже.

1 ответ

      @echo off 

setlocal EnableExtensions
title <nul && title ..\\%~nx0
%__AppDir__%chcp.com 1252 >nul

set "_bat=%~dpnx0" & %__AppDir__%mode.com 40,02
set "_key=HKCR\Directory\shell\Set_Folder_Icon"

set "_reg_qry=%__AppDir__%reg.exe query "%_key%""
set "_ico_reg=%SystemRoot%\System32\shell32.dll,71"
set "_bat=%_bat:\=\\%" & set "_ico_reg=%_ico_reg:\=\\%"

>nul 2>&1 ( %__AppDir__%net.exe "session" && set "_adm=y" || set "_adm=n"
      %_reg_qry%|%__AppDir__%find.exe "_" && set "_reg=y" || set "_reg=n")

if /i "%_adm%|%_reg%" == "y|n" >nul 2>&1 (
    ( %__AppDir__%reg.exe add "%_key%" /ve /d "Set Folder Icon" /f
      %__AppDir__%reg.exe add "%_key%\command" /ve /d "\"%_bat%\" \"%%V\"" /f
      %__AppDir__%reg.exe add "%_key%" /v Icon /t reg_sz /d "\"%_ico_reg%\"" /f
    )&& goto %:^))else if /i "%_adm%|%_reg%" == "n|n" (set "_er=y" && goto %:^|
    )else if "%_adm%%_reg%" == "yy" (set "_er=n" && goto %:^|)else ;set "_er=n"
    
%:^)
2>nul cd/d "%~dpnx1\\." && %__AppDir__%Attrib.exe -r -a .\. || goto %:^|

if exist .\\Folder.ico (%__AppDir__%Attrib.exe -s -r -h +a .\\Folder.ico
    )else if exist .\\*.ico (for %%i in (.\\*.ico)do ren "%%~fi" Folder.ico & goto %:^/
    )else goto %:^| )

%:^/ 
if exist .\\Desktop.ini >.\\Desktop.old (
     %__AppDir__%Attrib.exe -s -r -h +a .\\Desktop.ini
     echo;[.ShellClassInfo] && echo;IconResource=Folder.ico,0
     %__AppDir__%Findstr.exe /bliv "\[\.Shell IconR IconF IconI" <.\\Desktop.ini
    )else >nul 2>&1 %__AppDir__%CertUtil.exe -decode -f "%~dpnx0" .\\Desktop.ini

if exist .\\Desktop.old >nul 2>&1 move/y .\\Desktop.old .\\Desktop.ini
        
%:^|
if "%_er%" == "y" (%__AppDir__%timeout.exe 5|echo\Admin rights required!
    )else if "%_er%" == "n" (%__AppDir__%Attrib.exe +s +r +h -a .\\Desktop.ini 
     <con: %__AppDir__%Attrib.exe -r +a .\. && %__AppDir__%Attrib.exe +r -a .\.
     <con: cd../ && %comSpec% /e:off/v:off/s/q/r "ren "%~dpnx1" "%~nx1" >nul 2>&1"
    )>nul 2>&1 else rem :: batch continue.
     
2>nul del/q /f /a "%~f1\Desktop.old" & endlocal & <con: move nul 2>&0 ||goto :eOf
::-----BEGIN -----Wy5TaGVsbENsYXNzSW5mb10gDQpJY29uUmVzb3VyY2U9LlxGb2xkZXIuaWNvLDA
NCltWaWV3U3RhdGVdDQpNb2RlPQ0KVmlkPQ0KRm9sZGVyVHlwZT1HZW5lcmljDQo=-----END -----::


Этот код учитывает:

  • Что вы собираетесь положить бат в ту папку, где он должен быть, где он всегда будет вызываться.

  • Запустится в первый раз (от имени администратора), чтобы необходимые записи в реестре Windows были добавлены (самой битой) и указали местоположение вашего компьютера.File.bat.

  • Следующие выполнения будут вызываться в меню правой кнопки мыши в целевой папке.

  • Если файл Folder.ico находится в целевой папке, он будет использоваться, в случае отсутствия будет использоваться другой файл значка, переименованный в

  • Если файл существует в целевой папке, будут внесены необходимые изменения для замены файла..icoфайл, если нет, будет создан новый.


1. Запустите в первый раз от имени администратора, и все записи будут добавлены в реестр Windows.

2. Выполните (щелкните/запрос), не указывая действительную папку в качестве параметра, и процесс будет прерван.

3. Сообщите действительную папку, и она проверит, присутствует ли значок Folder.ico, и будет использовать его, если он не существует, он будет использовать другой, который находится в той же папке.

4. Если в указанной папке нет значка, она прервется без предупреждений.

5. Если в папке есть\Desktop.ini, будут использованы все настройки, кроме тех, которые относятся к параметрам значков.

6. Если в папке нет>\Desktop.ini, он создаст его, используя декодирование стандартного файла, сохраненного в строках base64.

  • По умолчанию используются папки, которые не содержат конфигурации.
      [.ShellClassInfo] 
IconResource=.\Folder.ico,0
[ViewState]
Mode=
Vid=
FolderType=Generic
  • Кодировка Base64:
      -----BEGIN CERTIFICATE-----
Wy5TaGVsbENsYXNzSW5mb10gDQpJY29uUmVzb3VyY2U9LlxGb2xkZXIuaWNvLDAN
CltWaWV3U3RhdGVdDQpNb2RlPQ0KVmlkPQ0KRm9sZGVyVHlwZT1HZW5lcmljDQo=
-----END CERTIFICATE-----
  • Кодировка Base64.\Desktop.iniстроки в bat/коде:
      ::-----BEGIN -----Wy5TaGVsbENsYXNzSW5mb10gDQpJY29uUmVzb3VyY2U9LlxGb2xkZXIuaWNvLDA
NCltWaWV3U3RhdGVdDQpNb2RlPQ0KVmlkPQ0KRm9sZGVyVHlwZT1HZW5lcmljDQo=-----END -----::

Примечание. Назначьте значок папке, некоторые отображаются сразу, другие через несколько секунд, похоже, то же самое происходит и при изменении обоев через реестр /командную строку Windows ...

Обс.: CertUtil.exeуже поставляется с Windows


Короткий ответ, в котором игнорируется наличие записей реестра, будет...

      @echo off 

setlocal EnableExtensions
%__AppDir__%mode.com 40,02 
%__AppDir__%chcp.com 1252 >nul

2>nul cd/d "%~f1\\." || goto %:^|
if not exist ".\\Folder.ico" goto %:^|
<con: %__AppDir__%Attrib.exe -r -a .\.

if exist .\\Desktop.ini >.\\Desktop.old (
     %__AppDir__%Attrib.exe -s -r -h +a .\\Desktop.ini
     echo;[.ShellClassInfo] && echo;IconResource=.\Folder.ico,0
     %__AppDir__%Findstr.exe /bliv "\[\.Shell IconR IconF IconI" <.\\Desktop.ini
    ) else >nul 2>&1 %__AppDir__%CertUtil.exe -decode -f "%~dpnx0" .\\Desktop.ini

if exist .\\Desktop.old >.\\Desktop.ini %__AppDir__%findstr.exe . <.\\Desktop.old

if exist .\\Folder.ico if exist .\\Desktop.ini (
     %__AppDir__%Attrib.exe -r +a .\. 
     %__AppDir__%Attrib.exe +r -a .\. 
     %__AppDir__%Attrib.exe +r -a .\\Folder.ico
     %__AppDir__%Attrib.exe +s +r +h -a .\\Desktop.ini
     >con: cd..\ && %comSpec% /e:off/v:off/q/r "ren "%%~dpnx1" "%%~nx1". 2>nul")

%:^|
2>nul del/q /f /a "%~f1\Desktop.old" & endlocal & <con: move nul 2>&0 ||goto :eOf
::-----BEGIN -----Wy5TaGVsbENsYXNzSW5mb10gDQpJY29uUmVzb3VyY2U9LlxGb2xkZXIuaWNvLDA
NCltWaWV3U3RhdGVdDQpNb2RlPQ0KVmlkPQ0KRm9sZGVyVHlwZT1HZW5lcmljDQo=-----END -----::

Этот код учитывает:

  • Что записи в реестре сделаны, и путь к bat-файлу в реестре установлен правильно.

  • Файл уже существует в папке назначения.

  • Если ее нет в целевой папке, будет создана новая, если она существует, соответствующие изменения будут внесены в папку.Folder.icoфайл будет создан в существующемDesktop.ini.


  • The Set_Folder_Icon.regфайл выглядит так:
      Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\Set_Folder_Icon]
@="Set Folder Icon"
"Icon"="\"C:\\\\WINDOWS\\\\System32\\\\shell32.dll,71\""

[HKEY_CLASSES_ROOT\Directory\shell\Set_Folder_Icon\command]
@="\"F:\\\\2020-SU\\\\Q1635169\\\\Q1635169.cmd\" \"%V\""

; Just replace drive and folder\file name...

  • The Remove_Set_Folder_Icon.regфайл выглядит так:
      Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\Directory\shell\Set_Folder_Icon]

  • Чтобы добавить записи реестра в командной строке, запустите от имени администратора:
      %__AppDir__%reg.exe add "HKCR\Directory\shell\Set_Folder_Icon" /ve /d "Set Folder Icon" /f
%__AppDir__%reg.exe add "HKCR\Directory\shell\Set_Folder_Icon\command" /ve /d "\"F:\\2020-SU\\Q1635169\\Q1635169.cmd\" \"%V\"" /f
%__AppDir__%reg.exe add "HKCR\Directory\shell\Set_Folder_Icon" /v Icon /t reg_sz /d "\"C:\\WINDOWS\\System32\\shell32.dll,71\"" /f

rem ::  Just replace F:\\2020-SU\\Q1635169\\Q1635169.cmd\" 
rem ::  To the pertinent Drive:\\Folder\\Path\\To\\File\\Name.cmd
  • Чтобы удалить записи реестра в командной строке, запустите от имени администратора:
      reg delete HKEY_CLASSES_ROOT\Directory\shell\Set_Folder_Icon /f

  • Вы также можете использовать.cmdвместо.regфайл для добавления всех записей в реестр Windows
  • Сохраните содержимое ниже как File.cmd и запустите его от имени администратора, чтобы добавить записи реестра.
      Windows Registry Editor Version 5.00 2>nul

;The following line/commands run and add the current file by "itself"
;@(cls & %__APPDIR__%reg.exe import "%~f0" >nul 2>&1 & goto=:EOF )

[HKEY_CLASSES_ROOT\Directory\shell\Set_Folder_Icon]
@="Set Folder Icon"
"Icon"="\"C:\\\\WINDOWS\\\\System32\\\\shell32.dll,71\""

[HKEY_CLASSES_ROOT\Directory\shell\Set_Folder_Icon\command]
@="\"F:\\\\2020-SU\\\\Q1635169\\\\Q1635169.cmd\" \"%V\""

; Just replace drive and folder\file name...
  • Чтобы сделать то же самое, чтобы удалить все записи в реестре Windows.
      Windows Registry Editor Version 5.00 2<nul

;The following line remove HKCR\...\Set_Folder_Icon
;@(cls & %__APPDIR__%reg.exe import "%~f0" >nul 2>&1 & goto=:EOF )

[-HKEY_CLASSES_ROOT\Directory\shell\Set_Folder_Icon]

Как интерпретатор команд Windows cmd.exe анализирует сценарии

Практическое руководство: Escape-символы, разделители и кавычки в командной строке Windows.

Другие вопросы по тегам