Мне нужно было извлечь значок # 238 из shell32.dll, и я не хотел загружать Visual Studio или Resourcehacker, поэтому я нашел пару сценариев PowerShell из Technet (спасибо Джону Гренфеллу и # https://social.technet.microsoft.com/Forums/windowsserver/en-US/16444c7a-ad61-44a7-8c6f-b8d619381a27/using-icons-in-powershell-scripts?forum=winserverpowershell), что сделал что-то похожее и создал новый скрипт (ниже), чтобы удовлетворить мои потребности.
Я ввел следующие параметры (исходный путь к DLL, имя файла значка назначения и индекс значка в файле DLL):
C: \ Windows \ System32 \ shell32.dll
C: \ Temp \ Restart.ico
238
Я обнаружил, что нужный мне значок индекса был # 238 методом проб и ошибок, временно создав новый ярлык (щелкните правой кнопкой мыши на рабочем столе и выберите «Создать» -> «Ярлык», введите «calc» и дважды нажмите «Enter»). Затем щелкните правой кнопкой мыши новый ярлык и выберите «Свойства», затем нажмите кнопку «Изменить значок» на вкладке «Ярлык». Вставьте путь C: \ Windows \ System32 \ shell32.dll и нажмите ОК. Найдите значок, который вы хотите использовать, и определите его индекс. NB. Индекс № 2 находится под номером 1, а не справа. Значок индекса № 5 находился в верхней части второго столбца на моем компьютере с Windows 7 x64.
Если у кого-то есть лучший метод, который работает аналогичным образом, но получает значки более высокого качества, мне было бы интересно узнать об этом. Спасибо, Шон.
#Windows PowerShell Code###########################################################################
# http://gallery.technet.microsoft.com/scriptcenter/Icon-Exporter-e372fe70
#
# AUTHOR: John Grenfell
#
###########################################################################
<#
.SYNOPSIS
Exports an ico and bmp file from a given source to a given destination
.Description
You need to set the Source and Destination locations. First version of a script, I found other examples but all I wanted to do as grab and ico file from an exe but found getting a bmp useful. Others might find useful
No error checking I'm afraid so make sure your source and destination locations exist!
.EXAMPLE
.\Icon_Exporter.ps1
.Notes
Version HISTORY:
1.1 2012.03.8
#>
Param ( [parameter(Mandatory = $true)][string] $SourceEXEFilePath,
[parameter(Mandatory = $true)][string] $TargetIconFilePath
)
CLS
#"shell32.dll" 238
If ($SourceEXEFilePath.ToLower().Contains(".dll")) {
$IconIndexNo = Read-Host "Enter the icon index: "
$Icon = [System.IconExtractor]::Extract($SourceEXEFilePath, $IconIndexNo, $true)
} Else {
[void][Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$image = [System.Drawing.Icon]::ExtractAssociatedIcon("$($SourceEXEFilePath)").ToBitmap()
$bitmap = new-object System.Drawing.Bitmap $image
$bitmap.SetResolution(72,72)
$icon = [System.Drawing.Icon]::FromHandle($bitmap.GetHicon())
}
$stream = [System.IO.File]::OpenWrite("$($TargetIconFilePath)")
$icon.save($stream)
$stream.close()
Write-Host "Icon file can be found at $TargetIconFilePath"