Как изменить значки для существующих ярлыков URL-адресов с помощью Powershell?

Я хочу изменить значок существующего ярлыка с помощью Powershell.

Я поигрался с ним, но не смог внести изменения, поэтому я вышел в интернет и оказался с пустыми руками. Я видел примеры с VB и Command Shell, но ничего с Powershell. Почти 99% продемонстрировали, как создать ярлык, но мне просто нужно знать, как изменить значок, и только значок.

Вот что я сделал до сих пор:

# Make a copy of the icon in the directory
PS> cd Program Files (x86)\Dir\Fol\
PS Program Files (x86)\Dir\Fol> cp 1234567890.ico 12345678901.ico

# Gets the IconFile property and changes it to the new icon
PS Program Files (x86)\Dir\Fol> cd Desktop\Folder\
PS Desktop\Folder>(Get-Content "file name")[6]
IconFile=C:\Program Files (x86)\Dir\Fol\1234567890.ico
PS Desktop\Folder>(Get-Content "file name")[6] -replace ".ico","1.ico"

Я пытался работать с WScript.Shell ComObject, но это, похоже, только создает новые ярлыки.

Я чувствую, что то, что я собирался с этим, сработало бы, если бы был способ сохранить, обновить и применить новый путь IconFile к объекту.

Я делаю это как действие по исправлению из-за того, что значки (или, может быть, что-то в символическом LNK?) «ломаются» и по умолчанию используются общие значки. Кажется, проблема только с ярлыками. Ярлык работает отлично, все нормально но по той или иной причине значки дефолтные. Если я войду и повторно применю то же имя значка через графический интерфейс, оно не изменится. Однако, если я каким-либо образом изменю имя файла .ico, а затем установлю его, это сработает. Не знаю, почему он это делает, но я хотел создать PS-скрипт, который делал бы это автоматически (и я искал предлог, чтобы заглушить скрипт)


person Rincewind    schedule 17.01.2017    source источник
comment
Это не ярлык lnk, а обычный текстовый файл, см. неофициальный ссылка на формат.   -  person wOxxOm    schedule 18.01.2017


Ответы (3)


Метод wscript.shell CreateShortcut создаст новый ИЛИ открыть существующий ярлык. Вот короткий сценарий, в котором вам нужно определить $ShortcutPath, $IconLocation и $IconArrayIndex:

$Shell = New-Object -ComObject ("WScript.Shell")
$Shortcut = $Shell.CreateShortcut($ShortcutPath)
$Shortcut.IconLocation = "$IconLocation, $IconArrayIndex"
$Shortcut.Save()
person BenH    schedule 17.01.2017
comment
Я видел $Shell.CreateShortcut() раньше, но думал, что это создаст новый ярлык. Я предполагаю, что он создает объект этого ярлыка, чтобы к нему можно было получить доступ программно? Что такое $IconArrayIndex? Кажется, я помню, что видел, что он был указан как 0. - person Rincewind; 18.01.2017
comment
@wOxxOm Не могли бы вы указать это в качестве ответа? И сообщить $shortcut.Save(), когда закончите? Я выберу его в качестве своего ответа - он сработал после небольшого возни. - person Rincewind; 18.01.2017
comment
Нет необходимости в хитрости. Если ярлык уже существует, он открывает его. Цитируется из MSDN: Метод CreateShortcut Создает новый ярлык или открывает существующий ярлык. Также проверена работа на Win10. - person BenH; 18.01.2017
comment
Если в массиве значков есть только одно изображение, индекс будет равен 0. Часто в массиве много значков, например, %SystemRoot%\System32\pmcsnap.dll имеет 15. - person BenH; 18.01.2017

для меня .iconlocation не существует в $shortcut и выдает ошибку (может быть версия powershell...). но вот как я изменил значок URL на собственный: (основная часть - это команды добавления контента)

$WshShell = New-Object -comObject WScript.Shell

$path = "C:\Users\USER\desktop\WEBSITE.url"

$targetpath = "https://WEBSITE.com"

$iconlocation = "C:\Users\USER\Desktop\YourIcon.ico"

$iconfile = "IconFile=" + $iconlocation

$Shortcut = $WshShell.CreateShortcut($path)

$Shortcut.TargetPath = $targetpath

$Shortcut.Save()

Add-Content $path "HotKey=0"

Add-Content $path "$iconfile"

Add-Content $path "IconIndex=0"
person user8127749    schedule 07.06.2017

Я писал скрипт для изменения значка папки по умолчанию на значок сетевого диска. Это может где-то помочь. Команда:

$ShortCut.IconLocation = "C:\WINDOWS\system32\imageres.dll, 28";

person user8715322    schedule 03.10.2017