色々できる(ハズ
EXEからアイコンを取り出す方法をさがしていたら、PowerShellでもできるらしい。
※Ver6からはSystem.Drawing.Iconが無い様だ。Windows10はVer5だから動くけど。
しかし、文法が ソースっぽさとコマンドラインが混ざってる(メンドクサイ
例えば、PowerShellの窓を開き
元ネタ:https://suzuzusu.hatenablog.com/entry/2016/10/14/043726
###########################################################
# アイコンを抽出して保存
###########################################################
function ExtractionIcon(
$Path, # 抽出する .exe のフルパス
$OutFile # 出力する .ico のフルパス
){
# アセンブリロード
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName System.IO
$str1 = "ExtractionIcon :Path=`"$Path`", :OutFile=`"$OutFile`""
$str1
# アイコンデータ抽出
$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()
}
と貼り付けると、
窓が開いている間だけ使える。(便利
しかし、この関数を呼び出す時はコマンドプロンプトっぽく
> ExtractionIcon "C:\Program Files (x86)\Sarad\DiCE\dice.exe" "a:\aaa\aaa.ico"
と打つ。
関数の中では、関数っぽく呼び出すのだから・・・
コマンドプロンプトから1コマンドづつ打って動作を確かめた後、
関数化する際には
「コマンドっぽい記述は関数っぽく書き直さないといけない。」
のが面倒だな。
後、Windowsでパパっと使う都合上、デスクトップに貼る場合、
Join-Path $env:UserProfile\Desktop "sample.ico"
で済ましたいがOneDriveをインストしてしまうと、アンスコしてもパスが変わってしまうから
Join-Path [System.Environment]::GetFolderPath("Desktop") "sample.ico"
と書かないと動かないPCも出てくる。
更に、コマンドラインのパラメータの区切りは空白文字なのは常識なので
コマンドのパラメータにコマンドを使うと、 どっちのパラメータなのか判らなくなる。
〇 コマンド (コマンド パラメータ1 パラメータ2) パラメータ3
× コマンド コマンド パラメータ1 パラメータ2 パラメータ3
だから、パラメータにコマンドの戻り値を使うなら、PowerShellでは()で括る仕様になっている。
先のEXEからアイコンを取り出すコマンドをコマンドラインから呼び出すには
ExtractionIcon "C:\Program.....\xxx.exe" (Join-Path [System.Environment]::GetFolderPath("Desktop") "sample.ico")
となってしまう。
最後に、今のPowerShellはRestrictedで、スクリプトファイルは実行不可で、
一時的に許可するなら
> pwsh.exe -ExecutionPolicy RemoteSigned xxxx.ps1
ps1のショートカットの場合も
powershell -ExecutionPolicy RemoteSigned -File ${元の内容}
となる。
ま、当然何でもできるから危なっかしい。
いくらPS1を実行不可にしても気の利いたショートカットを作られたら・・・
結局、MSが作ると、
大抵は使い物にならない
しかし、使い物になる様にバージョンアップすると
危なっかしい。
これは定説だな。