Значок поврежден с помощью Powershell exe в ico конвертер - PullRequest
0 голосов
/ 19 февраля 2020

Я ищу скрипт powershell для извлечения .ico из исполняемого файла.

Я нашел несколько инструментов, которые, кажется, работают так:

[System.Reflection.Assembly]::LoadWithPartialName('System.Drawing')  | Out-Null

$folder = "C:\TMP_7423\icons"
md $folder -ea 0 | Out-Null

dir $env:windir *.exe -ea 0 -rec |
  ForEach-Object { 
    $baseName = [System.IO.Path]::GetFileNameWithoutExtension($_.FullName)
    Write-Progress "Extracting Icon" $baseName
    [System.Drawing.Icon]::ExtractAssociatedIcon($_.FullName).ToBitmap().Save("$folder\$BaseName.ico")
}

Но проблема является то, что я хочу использовать PowerShell для EXE-конвертер для другого инструмента, который имеет функцию, чтобы непосредственно поместить значок в сгенерированный .exe. И я хочу использовать извлеченный ICO для сгенерированного исполняемого файла. Проблема в том, что конвертер ps1 в exe не работает ни с одним значком, сгенерированным экстрактором ico. Но дело в том, что конвертер ps1 в exe работает, когда я использую .ico, который я нашел в inte rnet.

Итак, у вас есть какой-нибудь исполняемый экстрактор .ico, который не извлекает поврежденные ico, но нормальный .ico, который мы могли бы найти на inte rnet?

Заранее спасибо! :)

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Вероятно, конвертеру ps1 в exe необходим правильный .ICO, и ваш код использует ToBitmap().Save(), что не сохранит информацию об изображении в формате ico. Для этого вам нужно использовать метод Save() самого извлеченного значка.

К сожалению, параметром для этого метода Save может быть только объект потока, а не просто путь.

Попробуйте:

Add-Type -AssemblyName System.Drawing

$folder = "C:\TMP_7423\icons"
if (!(Test-Path -Path $folder -PathType Container)) {
    $null = New-Item -Path $folder -ItemType Directory
}
Get-ChildItem -Path $env:windir -Filter '*.exe' -Recurse |
  ForEach-Object { 
    Write-Progress "Extracting Icon $($_.BaseName)"
    $ico = [System.Drawing.Icon]::ExtractAssociatedIcon($_.FullName)
    $target = Join-Path -Path $folder -ChildPath ('{0}.ico' -f $_.BaseName)
    # create a filestream object
    $stream = [System.IO.FileStream]::new($target, [IO.FileMode]::Create, [IO.FileAccess]::Write)
    # save as ICO format to the filestream
    $ico.Save($stream)
    # remove the stream object
    $stream.Dispose()
    $ico.Dispose()
}
0 голосов
/ 19 февраля 2020

Я написал утилиту Powershell, используя Windows Forms именно для этой цели:

Доступно здесь: IconTool

...