potisanのプログラミングメモ

プログラミング素人です。昔の自分を育ててくれたネット情報に少しでも貢献できるよう、情報を貯めていこうと思っています。Windows環境のC++やC#がメインです。

PowerShell7 登録された拡張子のProgIDとProgIDの概要を取得する

PowerShell 7で登録された拡張子のProgIDとProgIDの概要を取得するサンプルコードです。-Path-LiteralPathの挙動の違い、Get-ItemPropertyによる高速化(Get-ChildItem比)等を確認するためのコードです。

#呼び出し側のスコープにHKCRを登録します。
function Register-HKCR
{
  [OutputType([void])]
  param()
  Remove-PSDrive -Name HKCR -ErrorAction SilentlyContinue
  [void](New-PSDrive -PSProvider Registry -Root HKEY_CLASSES_ROOT -Name HKCR -Scope 1)
}

#拡張子とProgIDの関連付け情報を返します。
function Get-ExtensionProgID()
{
  [OutputType([PSCustomObject[]])]
  param()
  Get-ItemProperty -Path HKCR:.* -Name '(default)' -ErrorAction SilentlyContinue
    | ForEach-Object {[PSCustomObject]@{Extension=$_.PSChildName; ProgID=$_.'(default)'}}
}

#ProgIDの概要を取得します。
function Get-ProgIDDescription()
{
  [OutputType([PSCustomObject[]])]
  param(
    [Parameter(Mandatory)][string[]]$ProgID
  )
  $ProgID | ForEach-Object {
    $defaultProp = Get-ItemProperty -LiteralPath "HKCR:$_" -Name '(default)' -ErrorAction SilentlyContinue
    [PSCustomObject]@{ProgID=$_; Description=$defaultProp.'(default)'}
  }
}

#拡張子のProgIDとProgIDの概要を取得します。
function Get-ExtensionProgIDDescription()
{
  [OutputType([PSCustomObject[]])]
  param()
  Get-ExtensionProgID
    | Select-Object *, @{n="Description"; e={(Get-ProgIDDescription $_.ProgID).Description}}
}

Register-HKCR
Get-ExtensionProgIDDescription | Select-Object -First 20