PDA

Показать полную графическую версию : [решено] Смена иконки папки. контекстное меню (реестр) + CMD


Wheee111
21-07-2014, 11:18
Доброго времени суток, читателем этой темы. Спасибо что зашли посмотреть, надеюсь, сможете помочь советом.
Пытаюсь склепать следующую штуку: контекстное меню при нажатии ПКМ по папке, при нажатии на которое выполняется cmd скрипт со следующим кодом:

cmd /k "cd /d %L \\Попадаем в ту папку, по которой нажали пкм
&& echo 1 >> desktop.ini \\Создаем или меняем скрытый файл desktop.ini, который содержит свойства папки типа значка и вида папки.
&& attrib -r -a -s -h desktop.ini \\убираем все "лишние" атрибуты, чтобы удалить его, если он есть
&& del /f /q desktop.ini \\Удаляем этот файлик
&& echo [.ShellClassInfo] >> desktop.ini
&& echo IconResource=ICOFolders\Black.ico,0 >> desktop.ini \\пишем путь к иконке
&& echo [ViewState] >> desktop.ini \\какая-то порнуха, не знаю зачем оно, но оно есть внутри этого файла.
&& echo Mode= >> desktop.ini \\..
&& attrib +s +h desktop.ini \\Возвращаем аттрибуты
&& exit" \\ exit

пару раз он отработал, потом по непонятной мне причине перестал функционировать, так как это было задумано. при том что содержимое нужного файла он меняет.
Идея всего этого безобразия следующая: возможность менять иконку папки через контекстное меню примерно таким образом:
http://www.folderico.com/images/screenshot1.jpg

Возможно есть смысл оформить вышенарисованный скрипт функцией, в которую будет передаваться только название иконки, ибо все остальное одно и тоже.






Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Folder\shell\Test1]
@=""
"ExtendedSubCommandsKey"=""
"Icon"="ICOFolders\\Red.ico,0"
"Position"="Top"
"MUIVerb"="Сменить иконку"
"SubCommands"=""

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell]

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell\Black]
@="Black"
"Icon"="ICOFolders\\Black.ico,0"

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell\Black\command]
@="cmd /k \"cd /d %L && echo 1 >> desktop.ini && attrib -r -a -s -h desktop.ini && del /f /q desktop.ini && echo [.ShellClassInfo] >> desktop.ini && echo IconResource=ICOFolders\\Black.ico,0 >> desktop.ini && echo [ViewState] >> desktop.ini && echo Mode= >> desktop.ini && attrib +s +h desktop.ini && exit\""

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell\Red]
@="RED"
"Icon"="ICOFolders\\Red.ico,0"

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell\Red\command]
@="cmd /k \"cd /d %L && echo 1 >> desktop.ini && attrib -r -a -s -h desktop.ini && del /f /q desktop.ini && echo [.ShellClassInfo] >> desktop.ini && echo IconResource=ICOFolders\\Red.ico,0 >> desktop.ini && echo [ViewState] >> desktop.ini && echo Mode= >> desktop.ini && attrib +s +h desktop.ini && exit\""


[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell\Green]
@="Green"
"Icon"="ICOFolders\\Green.ico,0"

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell\Green\command]
@="cmd /k \"cd /d %L && echo 1 >> desktop.ini && attrib -r -a -s -h desktop.ini && del /f /q desktop.ini && echo [.ShellClassInfo] >> desktop.ini && echo IconResource=ICOFolders\\Green.ico,0 >> desktop.ini && echo [ViewState] >> desktop.ini && echo Mode= >> desktop.ini && attrib +s +h desktop.ini && exit\""




Собственно теперь сам вопрос: кто нибудь его сможет за меня "починить"?

gora
21-07-2014, 13:08
по непонятной мне причине перестал функционировать »
Для смены иконки на папке нужно еще менять атрибут R самой папки, да и запись в ini файл несколько отличается для XP и 7.
[решено] Как присвоить папке определенную иконку (http://forum.oszone.net/post-2103273.html#post2103273)

Wheee111
21-07-2014, 17:35
gora, спасибо за ответ. вопрос по 7x64.
у папки "read only" не стоит. тестировал на новых, старых, с полными правами etc..
Ваш вариант слегка не удобен тем, что значки нужно каждый раз копировать откуда-то в нужную папку. можно ли их подтягивать из одного и того же места?

Georgio
21-07-2014, 18:11
Собственно теперь сам вопрос: кто нибудь его сможет за меня "починить"? »




Примерно так:


Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Folder\shell\Test1]
@=""
"ExtendedSubCommandsKey"=""
"Icon"="C:\\ICOFolders\\Red.ico,0"
;"Position"="Top" ;Крайне не рекомендую.
"MUIVerb"="Сменить иконку"
"SubCommands"=""

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell]

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell\Black]
@="Black"
"Icon"="C:\\ICOFolders\\Black.ico,0"

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell\Black\command]
@="cmd /c \"cd /d \"%L\"& attrib -s -h desktop.ini>nul& echo [.ShellClassInfo]>desktop.ini& echo IconResource=C:\\ICOFolders\\Black.ico,0>>desktop.ini& attrib +s +h desktop.ini& attrib +r \"%L\"& exit\""

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell\Red]
@="Red"
"Icon"="C:\\ICOFolders\\Red.ico,0"

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell\Red\command]
@="cmd /c \"cd /d \"%L\"& attrib -s -h desktop.ini>nul& echo [.ShellClassInfo]>desktop.ini& echo IconResource=C:\\ICOFolders\\Red.ico,0>>desktop.ini& attrib +s +h desktop.ini& attrib +r \"%L\"& exit\""

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell\Green]
@="Green"
"Icon"="C:\\ICOFolders\\Green.ico,0"

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell\Green\command]
@="cmd /c \"cd /d \"%L\"& attrib -s -h desktop.ini>nul& echo [.ShellClassInfo]>desktop.ini& echo IconResource=C:\\ICOFolders\\Green.ico,0>>desktop.ini& attrib +s +h desktop.ini& attrib +r \"%L\"& exit\""


.

gora
21-07-2014, 18:13
вопрос по 7x64.
у папки "read only" не стоит. »
Ответ по win7 x64: У меня атрибут "R" стоит и прекрасно виден в файловом менеджере "Total Commander"

https://dl.dropboxusercontent.com/u/35142695/iconfolder.PNG

можно ли их подтягивать из одного и того же места? »
Пишите полный путь к иконке и иконку можно не копировать в папку.

Wheee111
23-07-2014, 11:26
gora, Премного благодарен за скриптик. он таки отработал нормально. но есть пара вопросов еще, и был бы весьма признателен, если бы помогли с ними.
1) переделал команду в реестре на следующее чудовище:

cmd /k "cd /d %L"
&& attrib -h -s *.ico
&& del *.ico
&& copy /Y C:\ICOFolders\Black.ico Black.ico
&& copy /Y C:\ICOFolders\c.cmd c.cmd
&& c.cmd
&& del c.cmd
&& attrib +h +s black.ico
&& exit

*где c.cmd - Ваш скрипт.

Вопрос по нему: как запихнуть в скрипт "c.cmd" назначение атрибутов файлу иконки, которое прописалось в desktop.ini
Если я правильно понял, то переменная %%~nxi равна *имя_иконки*.ico,0
Пардон за глупый вопрос, не силен в скриптах.
т.е. в тушку Вашего скрипта хочу добавить

Attrib +H +S "имя_иконки*.ico"


2) возможно я что-то не так понял, но что если в папке будет лежать несколько ico файлов?
3) Может быть знаете команду обновления иконки, которая исполняется при назначении иконки через свойства папки? (если задавать через Свойства\настройка\сменить значок, то новый значок появляется сразу же)
В принципе чистка кэша иконок вариант, но для этого нужно "убивать" explorer.exe, и при этом закрываются открытые папки. а это не удобно.
Чистка кэша таким образом: ie4uinit.exe -ClearIconCache почему то не помогает.
____________________________________

Цитата Wheee111:
можно ли их подтягивать из одного и того же места? »
Пишите полный путь к иконке и иконку можно не копировать в папку. »

в таком случае, как я понял, нужно будет плодить скрипты для каждой иконки отдельно.

Цитата Wheee111:
вопрос по 7x64.
у папки "read only" не стоит. »
Ответ по win7 x64: У меня атрибут "R" стоит и прекрасно виден в файловом менеджере "Total Commander" »
То ли я не понял Вас, то ли вы меня.
Для смены иконки на папке нужно еще менять атрибут R самой папки, да и запись в ini файл несколько отличается для XP и 7. »
Я решил что вы имеете в виду что у папки обязательно должен быть снят атрибут "только чтение".

gora
23-07-2014, 12:57
Попробуйте этот скрипт:@Echo Off
ChCp 1251>Nul
:: Скрипт SetIcon.cmd
:: Запуск скрипта SetIcon.cmd "Путь к папке у которой меняем иконку" "Имя файла иконки без пути"
Set fldr=%~1
If Not Defined fldr Exit
If "%fldr:~-1%"=="\" Set fldr=%fldr:~0,-1%
Set icon=%~2
If Not Defined icon Exit
:: Папка с иконками и скриптом SetIcon.cmd
Set home=c:\ICOFolders
If Exist "%fldr%\desktop.ini" Attrib -H -S "%fldr%\desktop.ini"
If "%icon%"=="No" (
Del "%fldr%\desktop.ini"
Attrib -R "%fldr%"
Exit
)
(Echo [.ShellClassInfo]
Echo IconResource="%home%\%icon%",0
Ver | Find "6.">Nul || (Echo IconFile="%home%\%icon%"& Echo IconIndex=0)
)>"%fldr%\desktop.ini"
Attrib +H +S "%fldr%\desktop.ini"
Attrib +R "%fldr%"Положите его в папку с иконками, а в команде его запуска (то, что вы делаете через контекстное меню) пропишите два параметра: "Путь к папке у которой меняем иконку" "Имя файла иконки без пути"

Wheee111
23-07-2014, 15:54
gora, Шикарно. это как раз то, что я имел в виду в первом посте.
только я туплю и не могу в строке запуска передать путь к папке скрипту. Если путь забиваю статикой- всё отлично. а как туда подставить результат работы команды?
Прошу прощения за очередной глупый вопрос. в итоге Вы за меня реализовали целиком идею )

gora
23-07-2014, 17:33
я туплю »
Жаль... :)
Тогда попробуйте запустить reg файл.Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Folder\shell\Test1]
@=""
"ExtendedSubCommandsKey"=""
"Icon"="C:\\ICOFolders\\Red.ico,0"
"MUIVerb"="Сменить иконку"
"SubCommands"=""

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell]

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell\Black]
@="Black"
"Icon"="C:\\ICOFolders\\Black.ico,0"

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell\Black\command]
@="C:\\ICOFolders\\SetIcon.cmd \"%L\" \"Black.ico\""

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell\Red]
@="Red"
"Icon"="C:\\ICOFolders\\Red.ico,0"

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell\Red\command]
@="C:\\ICOFolders\\SetIcon.cmd \"%L\" \"Red.ico\""

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell\Green]
@="Green"
"Icon"="C:\\ICOFolders\\Green.ico,0"

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell\Green\command]
@="C:\\ICOFolders\\SetIcon.cmd \"%L\" \"Green.ico\""

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell\zDefault]
@="Restore Default"

[HKEY_CLASSES_ROOT\Folder\shell\Test1\Shell\zDefault\command]
@="C:\\ICOFolders\\SetIcon.cmd \"%L\" \"No\""




© OSzone.net 2001-2012