1. ホーム
  2. スクリプト・コラム
  3. パワーシェル

PowerShell の実装は、ファイルを開くデフォルトのアプリケーションを照会する

2022-02-04 17:53:30

多くのファイル拡張子は、実行可能なアプリケーションにバインドされています。このため、Invoke-Item を使用してドキュメントを開くことができます。

ある拡張子のファイルを、どのデフォルトの参照プログラムが開くかを調べるのは、それほど面倒なことではありません。Windowsのレジストリを利用し、独自の解決策をプログラムすればいいのです。しかし、レジストリをスキャンするときは、この記事の焦点ではない、32ビットと64ビットのマシンに少し注意を払うこと、ポイントブランク。

もう一つのルートは、少し横道にそれますが、Windows APIを呼び出すもので、以下の例で実証されています。このルートを取る最大の利点は、オペレーティングシステムに適していることです。あなたへのコストは、単にC#のコードで間接的にWindows APIの関数を呼び出すことです。

$Source = @"
 
using System;
Text;
Runtime.InteropServices;
public class Win32API
  InteropServices; public class Win32API {
    [DllImport("shell32.dll", EntryPoint="FindExecutable")]
 
    public static extern long FindExecutableA(string lpFile, string lpDirectory, StringBuilder lpResult);
 
    public static string FindExecutable(string pv_strFilename)
    {
      StringBuilder objResultBuffer = new StringBuilder(1024);
      long lngResult = 0;
 
      lngResult = FindExecutableA(pv_strFilename, string.Empty, objResultBuffer);
 
      if(lngResult >= 32)
      {
        return objResultBuffer.ToString();
      }
 
      return string.Format("Error: ({0})", lngResult);
    }
  }
 
"@
 
Add-Type -TypeDefinition $Source -ErrorAction SilentlyContinue
 
$FullName = 'c:\Windows\windowsupdate.log'
$Executable = [Win32API]::FindExecutable($FullName)
   
"$FullName will be launched by $Executable"


唯一の制限は、FindExecutable()がチェックする必要があるファイルが存在し、ファイル拡張子で要求することができないことです。

また、@reidca feedback によると、この方法では cer や pfx 証明書ファイルなど、MMC アドオンによって開かれたファイルを検出できず、プログラムがクラッシュするとのことです。