Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Смена иконки папки. контекстное меню (реестр) + CMD (http://forum.oszone.net/showthread.php?t=285377)

Wheee111 21-07-2014 11:18 2379207

Смена иконки папки. контекстное меню (реестр) + CMD
 
Доброго времени суток, читателем этой темы. Спасибо что зашли посмотреть, надеюсь, сможете помочь советом.
Пытаюсь склепать следующую штуку: контекстное меню при нажатии ПКМ по папке, при нажатии на которое выполняется 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

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


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

Код REG Файла под спойлером



Код:



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 2379266

Цитата:

Цитата Wheee111
по непонятной мне причине перестал функционировать »

Для смены иконки на папке нужно еще менять атрибут R самой папки, да и запись в ini файл несколько отличается для XP и 7.
[решено] Как присвоить папке определенную иконку

Wheee111 21-07-2014 17:35 2379390

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

Georgio 21-07-2014 18:11 2379415

Цитата:

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




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


Код:

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 2379417

Цитата:

Цитата Wheee111
вопрос по 7x64.
у папки "read only" не стоит. »

Ответ по win7 x64: У меня атрибут "R" стоит и прекрасно виден в файловом менеджере "Total Commander"



Цитата:

Цитата Wheee111
можно ли их подтягивать из одного и того же места? »

Пишите полный путь к иконке и иконку можно не копировать в папку.

Wheee111 23-07-2014 11:26 2380130

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 почему то не помогает.
____________________________________

Цитата:

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

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

Цитата:

Цитата gora
Цитата Wheee111:
вопрос по 7x64.
у папки "read only" не стоит. »
Ответ по win7 x64: У меня атрибут "R" стоит и прекрасно виден в файловом менеджере "Total Commander" »

То ли я не понял Вас, то ли вы меня.
Цитата:

Цитата gora
Для смены иконки на папке нужно еще менять атрибут R самой папки, да и запись в ini файл несколько отличается для XP и 7. »

Я решил что вы имеете в виду что у папки обязательно должен быть снят атрибут "только чтение".

gora 23-07-2014 12:57 2380182

Попробуйте этот скрипт:
Код:

@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 2380258

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

gora 23-07-2014 17:33 2380307

Цитата:

Цитата Wheee111
я туплю »

Жаль... :)
Тогда попробуйте запустить 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\""



Время: 23:57.

Время: 23:57.
© OSzone.net 2001-