Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Смена иконки ярлыка командой в .bat

Ответить
Настройки темы
CMD/BAT - [решено] Смена иконки ярлыка командой в .bat

Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Изменения
Автор: Алексей_Мокшанов@vk
Дата: 09-11-2012
Вопрос с предысторией (для пущего осознания ситуации)
изначально хотелось переключать "Устройство воспроизведения" в один клик, тут нашлось решение в виде утилиты DefSound
тк в DefSound реализована командная строка, народ смекнул и заваял
start.bat
Код: Выделить весь код
IF 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.exe
START.JS
Код: Выделить весь код
var 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 тут, но про него не было ни слова, хочется знать его ценность и необходимость а также функционал

Отправлено: 13:53, 07-11-2012

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Алексей_Мокшанов@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: установка аудио устройства по умолчанию). В случае ОС соответствующей разрядности, используйте «DefSound-x64.exe», одновременно заменив и в скрипте имя исполняемого файла на «DefSound-x64.exe» (я не стал усложнять скрипт определением разрядности ОС и выбором соответствующего исполняемого файла).

Cозданный скрипт *.vbs при первом своём запуске создаст на Рабочем столе текущего пользователя одноимённый себе ярлык. Далее Вы можете просто пользоваться созданным ярлыком.
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:51, 09-11-2012 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Цитата Iska:
файл с расширением «.vbs» »
работает на ура, но хочется уточнить, в данном случае будет происходить затирание старого ярлыка на новый с другими параметрами?
можете ли Вы сделать так что бы пути к файлам иконок не были жёстко привязаны, тобиш были только указаны имена Icon0.ico и Icon1.ico? потому как иконки всегда будут лежать в тойже папке что и .vbs а вот папка с DefSound имеет все шансы на перемещение
а неплохая идея определять разрядность ОС, хотя если это шибко сложно и так хорошо
спасибо за помощь

Последний раз редактировалось Алексей_Мокшанов@vk, 09-11-2012 в 01:39.


Отправлено: 01:31, 09-11-2012 | #12


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Алексей_Мокшанов@vk:
работает на ура, но хочется уточнить, в данном случае будет происходить затирание старого ярлыка на новый с другими параметрами? »
Я не проверял, какими именно функциями WinAPI библиотека «wshom.ocx» реализует вызов метода «.CreateShortcut()» (этот метод предназначен как для создания, равно и модификации существующего ярлыка).

Цитата Алексей_Мокшанов@vk:
можете ли Вы сделать так что бы пути к файлам иконок не были жёстко привязаны, тобиш были только указаны имена Icon0.ico и Icon1.ico? потому как иконки всегда будут лежать в тойже папке что и .vbs а вот папка с DefSound имеет все шансы на перемещение »
Да. Могу.

Цитата Алексей_Мокшанов@vk:
а неплохая идея определять разрядность ОС, хотя если это шибко сложно и так хорошо »
Я могу попробовать. Но проверять сие — Вам: у меня нет прямого доступа ни к Vista, ни к Windows 7, равно как и их x64 вариантам. Вы готовы потрудиться совместно на этой почве?

Отправлено: 01:48, 09-11-2012 | #13


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Цитата Iska:
Да. Могу. »
сделайте если это вас не затруднит
Цитата Iska:
Вы готовы потрудиться совместно на этой почве? »
в наличие Windows 7 x64, конечно проверю, для теста наверно надо чтоб создавался log.txt чтоб в нём можно было поглядеть как отработал скрипт

Отправлено: 01:56, 09-11-2012 | #14


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Попробуйте так (не проверялось):
читать дальше »
Код: Выделить весь код
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: установка аудио устройства по умолчанию), а также файлы иконок «Icon0.ico», «Icon1.ico». При желании можете раскомментировать строку, задающую горячую клавишу для создаваемого ярлыка, равно как и поменять там саму горячую клавишу.
Это сообщение посчитали полезным следующие участники:

Отправлено: 02:37, 09-11-2012 | #15


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Цитата Iska:
Попробуйте так »
"Устройство воспроизведения" переключает этот вариант скрипта, иконка (ярлык) меняется
проверил определение разрядности ОС простым удалением DefSound-x64.exe, да ругается что не может найти его, удаление DefSound-x32.exe не приводит ни к какой реакции, следовательно работает
(даже и не знаю для чего сделан DefSound-x64.exe, ведь и DefSound-x32.exe справляется)

Последний раз редактировалось Алексей_Мокшанов@vk, 09-11-2012 в 03:15.


Отправлено: 02:50, 09-11-2012 | #16


Аватара для yurfed

Ветеран


Сообщения: 20133
Благодарности: 3145

Профиль | Отправить PM | Цитировать


Цитата Алексей_Мокшанов@vk:
можете ли Вы сделать так что бы пути к файлам иконок не были жёстко привязаны, »
Цитата Алексей_Мокшанов@vk:
а неплохая идея определять разрядность ОС, хотя если это шибко сложно и так хорошо »
Цитата Алексей_Мокшанов@vk:
сделайте если это вас не затруднит »
А начиналось с просьбы дать только ложку к обеду

-------
Хочу ли я - Могу ли я - Говно ли я - Магнолия


Отправлено: 03:02, 09-11-2012 | #17


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Цитата yurfed:
А начиналось с просьбы дать только ложку к обеду »
как хорошо что мир не без добрых людей

Отправлено: 03:21, 09-11-2012 | #18


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Алексей_Мокшанов@vk:
даже и не знаю для чего сделан DefSound-x64.exe, ведь и DefSound-x32.exe справляется) »
Отпишитесь автору: EreTIk's Box » Контакты. Полагаю, он намного лучше меня сумеет дать ответ на Ваш вопрос.

Отправлено: 03:54, 09-11-2012 | #19


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


Эта меняющаяся иконка только на рабочем столе (прокатывает) работает-так я понял,получилось у меня.
А чтоб такая иконка текущего аудиоустройства в трее висела.Ведь в трее стандартная Громкость иконка остаётся неизменной,при переключении разных аудиоустройств,но при этом выводится всплывающая подсказка от текущем аудиоустройстве, и отображает его уровень громкости.
Наверно нереально такое?

ПопробЫвал Windows Tray Icons Creator.exe-не много не то, но и не получилось

Отправлено: 18:02, 26-12-2012 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Смена иконки ярлыка командой в .bat

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интернет - [решено] проблема с командой arp -s Dosmod Microsoft Windows 7 1 07-10-2011 20:19
как воспользоваться данной командой? xrenomx AutoIt 8 17-10-2010 22:38
[решено] Создание ярлыка и смена иконки? Centrinar AutoIt 1 10-04-2010 23:39
Разное - [решено] Смена иконки у ярлыка на DOS приложение Delirium Microsoft Windows 7 9 18-01-2010 07:50
Проблемы с командой su m0rfeusl Общий по Linux 6 28-01-2004 15:17




 
Переход