Home > Windows にまつわる e.t.c.

PowerShell でプログラムのアイコンを抽出する


RemoteApp 環境を作っていると、アプリケーション アイコンの物理ファイルが欲しくなる時があります。

アイコン抽出ツールは色々ありますが、PowerShell でも簡単に抽出できたりします
(PowerShell 6 (RC) は .Net Core が System.Drawing.Icon をサポートしていないので PowerShell 5 以前でのみで使えます)

関数にするとこんな感じ

###########################################################
# アイコンを抽出して保存
###########################################################
function ExtractionIcon( 
            $Path,      # 抽出する .exe のフルパス
            $OutFile    # 出力する .ico のフルパス
        ){

    # アセンブリロード
    Add-Type -AssemblyName System.Drawing

    # アイコンデータ抽出
    $IconData = [System.Drawing.Icon]::ExtractAssociatedIcon( $Path )

    # 出力用ファイルストリーム
    $FS = New-Object System.IO.FileStream( $OutFile, [System.IO.FileMode]::Create )

    # 保存
    $IconData.Save( $fs )
    $fs.Close()

    # オブジェクトの始末
    $fs.Dispose()
    $IconData.Dispose()
}

 

と、ここまで書いて問題発生。
.NET ハンドリングでは 16 色アイコンしか抽出できなく、この問題を解決するには Win32API を叩くしかないぽい... orz

色々調べていたら、PowerShell Gallery にコマンドレットが公開されていました。

PowerShell Gallery | IconExport 2.0.0
https://www.powershellgallery.com/packages/IconExport/2.0.0

Export-Icon from DLL and EXE using PowerShell
https://gallery.technet.microsoft.com/scriptcenter/Export-Icon-from-DLL-and-9d309047

 

モジュールインストールは以下のようにします。

Install-Module -Name IconExport

 

このモジュールをインストールすると Export-Icon コマンドレットが使えるようになります。

Export-Icon -Path <アイコンを抽出する .exe or .dll> -Directory <出力ディレクトリ>

 

コードを見たい場合は、Save-Module -Name IconExport -Path <path> でモジュールダウンロードすればソースを見る事が出来ます。

 

インストールしたモジュールをアンインストールする場合は、以下のようにします。

Uninstall-Module -Name IconExport

 

関連情報

関数を PowerShell プロンプトで実行する
http://www.vwnet.jp/Windows/PowerShell/2016100401/UseFunctionInPsPrompt.htm

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.