Показать полную графическую версию : [решено] Смена иконки ярлыка командой в .bat
Алексей_Мокшанов@vk
07-11-2012, 13:53
Вопрос с предысторией (для пущего осознания ситуации)
изначально хотелось переключать "Устройство воспроизведения" в один клик, тут (http://forum.oszone.net/thread-181350.html) нашлось решение в виде утилиты DefSound (http://eretik.omegahg.com/tools/DefSound.html)
тк в DefSound реализована командная строка, народ смекнул и заваял
start.batIF exist log.txt goto loop1
echo 0>log.txt
DefSound-x32.exe 0
goto exit
:loop1
del log.txt
DefSound-x32.exe 1
:exit
taskkill /im DefSound-x32.exeSTART.JSvar activex = new ActiveXObject("WScript.Shell");
activex.Run("start.bat", 0, true);
оба файлика требуется положить в папку к DefSound и запускать всю эту конструкцию с ярлыка созданного для START.JS
теперь у меня имеется проблема в индикации активного "Устройство воспроизведения", и мне думается что иконка ярлыка (созданного для START.JS) самый изящный способ
потому прошу откликнуться людей кто в состоянии дополнить (переделать) данную конструкцию для того что бы она не только переключала "Устройство воспроизведения" но и меняла иконку ярлыка
в системе имеется два устройства вывода звука, насколько я понимаю их в коде нумеруют как 0 и 1, чтоб далеко не отходить от устоявшегося обозначения будем считать что в папку со всеми файлами положены две иконки 0.ico и 1.ico, а на рабочем столе имеется ярлык START.lnk
не в тему: что выполняет (делает) данный код@ECHO OFF
SETLOCAL EnableDelayedExpansion
FOR /F "tokens=*" %%I IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render"') DO (
SET AudCount = 0
FOR /F "tokens=3" %%J IN ('REG QUERY "%%I"^|FINDSTR /I /C:"devicestate"') DO (
IF /I "%%J" EQU "0x1" (
SET /a AudCount+=1
ECHO %%I>>"%TMP%\renderlist.txt"
)
)
)
IF /I %AudCount% NEQ 0 (
SET DevID=0
SET DevName=
FOR /F "tokens=*" %%I IN (%TMP%\renderlist.txt) DO (
FOR /F "tokens=2*" %%J IN ('REG QUERY "%%I\Properties" /v "{b3f8fa53-0004-438e-9003-51a46e139bfc},6"') DO (
SET DevName=%%K
)
FOR /F "tokens=2*" %%J IN ('REG QUERY "%%I\Properties" /v "{a45c254e-df1c-4efd-8020-67d146a850e0},2"') DO (
SET DevName=!DevName! - %%K
)
IF /I "!DevName!" EQU "%~1" (
CD /D "%~dp0"
IF /I "%PROCESSOR_ARCHITECTURE%" EQU "x86" DefSound-x32.exe !DevID! %~2
IF /I "%PROCESSOR_ARCHITECTURE%" EQU "amd64" DefSound-x64.exe !DevID! %~2
DEL /F "%TMP%\renderlist.txt"
GOTO :EOF
)
SET /a DevID+=1
)
DEL /F "%TMP%\renderlist.txt"
)обнаружил это в DefSound.cmd, прилагался в архиве DefSound.zip (http://forum.oszone.net/attachment.php?attachmentid=73793&d=1323422414) тут (http://forum.oszone.net/post-1812132-17.html), но про него не было ни слова, хочется знать его ценность и необходимость а также функционал
А может сделать два ярлыка с разными иконками и копировать их bat-ом попеременно с автоматическим удаление перед копированием новогоИЛИ (http://forum.oszone.net/thread-204545.html)
ссылки на инструкции и мануалы не предлагать, требуется готовое решение имеющейся проблемы »
Желанию получить готовое решение должны предшествовать хотя бы минимальные усилия:
1. Разместить потребную информацию здесь же, а не посылать возжелавших помочь бегать по ссылкам.
2. Сообщить имя неназванного ярлыка на Рабочем столе.
3. Выложить здесь же Ваши «допустим 0.ico и 1.ico». Или это тоже — к «требуется готовое решение», Вам должен кто-то сделать?
Iska, Капитан Тиг - «Хранитель Пиратского Кодекса Чести» :laugh:
Алексей_Мокшанов@vk
08-11-2012, 09:25
А может сделать два ярлыка с разными иконками и копировать их bat-ом попеременно с автоматическим удаление перед копированием нового »идея не так уж и плоха если бы не одно но, ярлыки фигурно разложены по рабочему столу, а если каждый раз создавать новый он будет липнуть к левому краю в "конец очереди" что не есть гуд и вовсе не по феншую (если например не удалять предварительно а с заменой то место сохраниться насколько мне известно), ИЛИ возможно где то близко но тоже врятли решает поставленную задачу (даже если там и имеется необходимая составляющая то мне не подсилу её вычленить и применить), потому и требуется именно смена иконки ярлыка
спасибо за попытку
Желанию получить готовое решение должны предшествовать хотя бы минимальные усилия:
1. Разместить потребную информацию здесь же, а не посылать возжелавших помочь бегать по ссылкам.
2. Сообщить имя неназванного ярлыка на Рабочем столе.
3. Выложить здесь же Ваши «допустим 0.ico и 1.ico». Или это тоже — к «требуется готовое решение», Вам должен кто-то сделать? »1. Отчасти согласен, но не хотелось разводить дубли да и кликнуть на ссылку не считаю за маломальский труд
2. я думаю если в коде его назвать START.lnk а потом пояснить что мол вместо START.lnk впиши название своего, так будет вполне приемлемо
3. а я думаю человеку составляющему (дополняющему) код по барабану что за картинки кроются под 0.ico и 1.ico, главное их имена прописать в коде правильно, а потом пояснить мол не забудь их в папку с прогой и скриптами положить, так будет вполне приемлемо
если не нравится идея с копированием (из-за фигурного расположения) то возможен вариант с
attrib 1.lnk +h
attrib 2.lnk -h
изменение в расположение всего одна клетка...
Алексей_Мокшанов@vk
08-11-2012, 21:00
если не нравится идея с копированием (из-за фигурного расположения) то возможен вариант с
Код:
attrib 1.lnk +h
attrib 2.lnk -h
изменение в расположение всего одна клетка... »
не могли бы вы пояснить мне как и куда применить эти две строчки и что в этоге получиться
вот скрипт меняющий иконку на рабочем столе - не перемещая...
var vbOKCancel = 1;
var vbInformation = 64;
var vbCancel = 2;
var WSHShell = WScript.CreateObject("WScript.Shell");
Welcome();
var DesktopPath = WSHShell.SpecialFolders("Desktop");
var MyShortcut = WSHShell.CreateShortcut(DesktopPath + "\\Блокнот.lnk");
MyShortcut.TargetPath = WSHShell.ExpandEnvironmentStrings("%windir%\\notepad.exe");
MyShortcut.WorkingDirectory = WSHShell.ExpandEnvironmentStrings("%windir%");
MyShortcut.WindowStyle = 4;
MyShortcut.IconLocation = WSHShell.ExpandEnvironmentStrings("c:\\icq.ico");
MyShortcut.Save();
function Welcome() {
var intDoIt;
}
создаешь два файла ico1.js и ico2.js
и
IF exist log.txt goto loop1
echo 0>log.txt
DefSound-x32.exe 0
ico1.js
goto exit
:loop1
del log.txt
DefSound-x32.exe 1
ico2.js
:exit
taskkill /im DefSound-x32.exe
пример скрипта для ярлыка notepad.exe меняем на свою программу и все работает ... )))
если не понятно
var MyShortcut = Название ярлыка .lnk
MyShortcut.TargetPath = Расположение .exe
MyShortcut.WorkingDirectory = Рабочая директория .exe
MyShortcut.IconLocation = Расположение файла .ico
ОБЯЗАТЕЛЬНОЕ ИСПОЛЬЗОВАНИЕ ДВОЙНОГО СЛЕША \\ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Прошу прощения за мои разные мысли но простое замещение одного и того же файла происходит без перемещения по рабочему столу ))))
приведу пример
[code]
IF exist log.txt goto loop1
echo 0>log.txt
DefSound-x32.exe 0
copy /y c:\1.ico "рабочий стол\0.ico"
goto exit
:loop1
del log.txt
DefSound-x32.exe 1
copy /y c:\2.ico "рабочий стол\0.ico"
:exit
taskkill /im DefSound-x32.exe
Алексей_Мокшанов@vk
09-11-2012, 00:06
вот скрипт »он прям меняет иконку или пересоздаёт ярлык с новой иконкой?
простое замещение одного и того же файла » это мы просто подменяем иконку на которую настроен ярлык? чего то так не работает, иконка заменяется а вот ярлык отображает то что изначально было
Или имеешь в виду что просто копируем с заменой заранее созданные и настроенные на разные иконки ярлыки?
в общем оба метода опробовал, оба работают, и оба занимаются затиранием старого ярлыка тем или иным способом, хотелось бы конечно изменять именно свойства ярлыка
спасибо за помощь
Алексей_Мокшанов@vk, поместите следующий код:
Option Explicit
Dim objDictionary
Dim objFSO
Dim objWshShell
Dim strPath2DefSound
Set objDictionary = WScript.CreateObject("Scripting.Dictionary")
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objWshShell = WScript.CreateObject("WScript.Shell")
With objDictionary
.Add 0, "C:\Мои иконки\Icon0.ico"
.Add 1, "C:\Мои иконки\Icon1.ico"
End With
strPath2DefSound = objFSO.BuildPath(objFSO.GetParentFolderName(WScript.ScriptFullName), "DefSound-x32.exe")
If objFSO.FileExists(strPath2DefSound) Then
If WScript.Arguments.Count = 1 Then
Select Case WScript.Arguments.Item(0)
Case "0", "1"
objWshShell.Run """" & strPath2DefSound & """ " & WScript.Arguments.Item(0), 0, True
CreateShortcutOnDesktop Abs(Not CBool(WScript.Arguments.Item(0)))
Case Else
CreateShortcutOnDesktop 0
End Select
Else
CreateShortcutOnDesktop 0
End If
Else
WScript.Echo "Can't find [" & strPath2DefSound & "]"
End If
Set objWshShell = Nothing
Set objFSO = Nothing
Set objDictionary = Nothing
WScript.Quit 0
'=============================================================================
'=============================================================================
Sub CreateShortcutOnDesktop(lngArgument)
With objWshShell.CreateShortcut(objFSO.BuildPath(objWshShell.SpecialFolders("Desktop"), objFSO.GetBaseName(WScript.ScriptName) & ".lnk"))
.TargetPath = WScript.ScriptFullName
.WorkingDirectory = objFSO.GetParentFolderName(WScript.ScriptFullName)
.Arguments = CStr(lngArgument)
.WindowStyle = 0
'.Hotkey = "CTRL+SHIFT+S"
.IconLocation = objDictionary.Item(lngArgument)
.Description = "Shortcut to quick change default sound"
.Save
End With
End Sub
'=============================================================================
в файл с расширением «.vbs», заменив пути к файлам иконок на Ваши собственные. Поместите этот файл в любое потребное место. Поместите рядом с этим файлом файл «DefSound-x32.exe» (работа с утилитой основана на этой статье: EreTIk's Box » Утилиты » DefSound: установка аудио устройства по умолчанию (http://eretik.omegahg.com/tools/DefSound.html)). В случае ОС соответствующей разрядности, используйте «DefSound-x64.exe», одновременно заменив и в скрипте имя исполняемого файла на «DefSound-x64.exe» (я не стал усложнять скрипт определением разрядности ОС и выбором соответствующего исполняемого файла).
Cозданный скрипт *.vbs при первом своём запуске создаст на Рабочем столе текущего пользователя одноимённый себе ярлык. Далее Вы можете просто пользоваться созданным ярлыком.
Алексей_Мокшанов@vk
09-11-2012, 01:31
файл с расширением «.vbs» »
работает на ура, но хочется уточнить, в данном случае будет происходить затирание старого ярлыка на новый с другими параметрами?
можете ли Вы сделать так что бы пути к файлам иконок не были жёстко привязаны, тобиш были только указаны имена Icon0.ico и Icon1.ico? потому как иконки всегда будут лежать в тойже папке что и .vbs а вот папка с DefSound имеет все шансы на перемещение
а неплохая идея определять разрядность ОС, хотя если это шибко сложно и так хорошо
спасибо за помощь
работает на ура, но хочется уточнить, в данном случае будет происходить затирание старого ярлыка на новый с другими параметрами? »
Я не проверял, какими именно функциями WinAPI библиотека «wshom.ocx» реализует вызов метода «.CreateShortcut()» (этот метод предназначен как для создания, равно и модификации существующего ярлыка).
можете ли Вы сделать так что бы пути к файлам иконок не были жёстко привязаны, тобиш были только указаны имена Icon0.ico и Icon1.ico? потому как иконки всегда будут лежать в тойже папке что и .vbs а вот папка с DefSound имеет все шансы на перемещение »
Да. Могу.
а неплохая идея определять разрядность ОС, хотя если это шибко сложно и так хорошо »
Я могу попробовать. Но проверять сие — Вам: у меня нет прямого доступа ни к Vista, ни к Windows 7, равно как и их x64 вариантам. Вы готовы потрудиться совместно на этой почве?
Алексей_Мокшанов@vk
09-11-2012, 01:56
Да. Могу. »сделайте если это вас не затруднит
Вы готовы потрудиться совместно на этой почве? »в наличие Windows 7 x64, конечно проверю, для теста наверно надо чтоб создавался log.txt чтоб в нём можно было поглядеть как отработал скрипт
Попробуйте так (не проверялось):
Option Explicit
Dim objDictionary
Dim objFSO
Dim objWshShell
Dim strPath2Script
Dim strPath2DefSound
Dim elem
Dim objSWbemObjectEx
Set objDictionary = WScript.CreateObject("Scripting.Dictionary")
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objWshShell = WScript.CreateObject("WScript.Shell")
With objFSO
strPath2Script = .GetParentFolderName(WScript.ScriptFullName)
objDictionary.Add 0, .BuildPath(strPath2Script, "Icon0.ico")
objDictionary.Add 1, .BuildPath(strPath2Script, "Icon1.ico")
For Each elem In objDictionary.Items
If Not .FileExists(elem) Then
WScript.Echo "Icon file [" & elem & "] not found"
WScript.Quit 1
End If
Next
For Each objSWbemObjectEx In WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2").InstancesOf("Win32_OperatingSystem")
Select Case objSWbemObjectEx.Version
Case "6.0.6000", "6.0.6001", "6.0.6002", "6.1.7600", "6.1.7601", "6.2.9200" ' http://en.wikipedia.org/wiki/Windows_NT#Releases
Select Case objSWbemObjectEx.OSArchitecture
Case "32-bit" ' x86
strPath2DefSound = .BuildPath(strPath2Script, "DefSound-x32.exe")
Case "64-bit" ' x64
strPath2DefSound = .BuildPath(strPath2Script, "DefSound-x64.exe")
End Select
Case Else
WScript.Echo "Unsupported OS version:", objSWbemObjectEx.Version
WScript.Quit 2
End Select
Exit For
Next
If .FileExists(strPath2DefSound) Then
If WScript.Arguments.Count = 1 Then
Select Case WScript.Arguments.Item(0)
Case "0", "1"
objWshShell.Run """" & strPath2DefSound & """ " & WScript.Arguments.Item(0), 0, True
CreateShortcutOnDesktop Abs(Not CBool(WScript.Arguments.Item(0)))
Case Else
CreateShortcutOnDesktop 0
End Select
Else
CreateShortcutOnDesktop 0
End If
Else
WScript.Echo "Can't find [" & strPath2DefSound & "]"
WScript.Quit 3
End If
End With
Set objWshShell = Nothing
Set objFSO = Nothing
Set objDictionary = Nothing
WScript.Quit 0
'=============================================================================
'=============================================================================
Sub CreateShortcutOnDesktop(lngArgument)
With objWshShell.CreateShortcut(objFSO.BuildPath(objWshShell.SpecialFolders("Desktop"), objFSO.GetBaseName(WScript.ScriptName) & ".lnk"))
.TargetPath = WScript.ScriptFullName
.WorkingDirectory = strPath2Script
.Arguments = CStr(lngArgument)
.IconLocation = objDictionary.Item(lngArgument)
.WindowStyle = 0
.Description = "Shortcut to quick change default sound"
'.Hotkey = "CTRL+SHIFT+S"
.Save
End With
End Sub
'=============================================================================
Поместите рядом с этим файлом файлы «DefSound-x32.exe», «DefSound-x64.exe» (работа с утилитой основана на этой статье: EreTIk's Box » Утилиты » DefSound: установка аудио устройства по умолчанию (http://eretik.omegahg.com/tools/DefSound.html)), а также файлы иконок «Icon0.ico», «Icon1.ico». При желании можете раскомментировать строку, задающую горячую клавишу для создаваемого ярлыка, равно как и поменять там саму горячую клавишу.
Алексей_Мокшанов@vk
09-11-2012, 02:50
Попробуйте так »
"Устройство воспроизведения" переключает этот вариант скрипта, иконка (ярлык) меняется
проверил определение разрядности ОС простым удалением DefSound-x64.exe, да ругается что не может найти его, удаление DefSound-x32.exe не приводит ни к какой реакции, следовательно работает
(даже и не знаю для чего сделан DefSound-x64.exe, ведь и DefSound-x32.exe справляется)
можете ли Вы сделать так что бы пути к файлам иконок не были жёстко привязаны, »
а неплохая идея определять разрядность ОС, хотя если это шибко сложно и так хорошо »
сделайте если это вас не затруднит »
А начиналось с просьбы дать только ложку к обеду :)
Алексей_Мокшанов@vk
09-11-2012, 03:21
А начиналось с просьбы дать только ложку к обеду »
как хорошо что мир не без добрых людей :butcher:
даже и не знаю для чего сделан DefSound-x64.exe, ведь и DefSound-x32.exe справляется) »
Отпишитесь автору: EreTIk's Box » Контакты (http://eretik.omegahg.com/Contacts.html). Полагаю, он намного лучше меня сумеет дать ответ на Ваш вопрос.
koliambia
26-12-2012, 18:02
Эта меняющаяся иконка только на рабочем столе (прокатывает) работает-так я понял,получилось у меня.
А чтоб такая иконка текущего аудиоустройства в трее висела.Ведь в трее стандартная Громкость иконка остаётся неизменной,при переключении разных аудиоустройств,но при этом выводится всплывающая подсказка от текущем аудиоустройстве, и отображает его уровень громкости.
Наверно нереально такое?
Попробывал Windows Tray Icons Creator.exe-не много не то, :) но и не получилось
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.