今回もVBScriptネタです。
今回は「プログラムと機能」から、インストールされているアプリケーションの一覧を取得するスクリプトを書いてみました。
Option Explicit Dim itm With CreateObject("Shell.Application").Namespace("shell:::{7b81be6a-ce2b-4676-a29e-eb907a5126c5}") For Each itm In .Items WScript.Echo itm.Name Next End With
仕組みは「AppUserModelId(AUMID)を列挙するVBScript」と同じで、「プログラムと機能」をフォルダとして扱い、中にあるアイテム(FolderItem2)の名前を列挙しているだけです。
このスクリプトを利用すると、指定したアプリケーションがインストールされているかどうかを判別するスクリプトも簡単に書くことができます。
(名前だけで判断しているので、正確性に欠ける場合があるかもしれませんが)
Option Explicit MsgBox IsInstalledApplication("ABCDEFG") 'インストールされていない場合は空の文字列が返る MsgBox IsInstalledApplication("7-Zip") 'インストールされている場合はプログラム名が返る Private Function IsInstalledApplication(ByVal AppName) '指定したアプリケーションがインストールされているか判別 Dim ret Dim itm ret = "" '初期化 With CreateObject("Shell.Application").Namespace("shell:::{7b81be6a-ce2b-4676-a29e-eb907a5126c5}") For Each itm In .Items If InStr(LCase(itm.Name), LCase(AppName)) Then ret = itm.Name Exit For End If Next End With IsInstalledApplication = ret End Function
レジストリにあるアンインストール情報から取得することもできます。
Option Explicit MsgBox IsInstalledApplication("ABCDEFG") 'インストールされていない場合は空の文字列が返る MsgBox IsInstalledApplication("7-Zip") 'インストールされている場合はプログラム名が返る Private Function IsInstalledApplication(ByVal AppName) '指定したアプリケーションがインストールされているか判別 Dim reg Dim keys Dim key Dim ret Dim res Dim display_name Const HKEY_CURRENT_USER = &H80000001 Const HKEY_LOCAL_MACHINE = &H80000002 Const SubKeyName = "Software\Microsoft\Windows\CurrentVersion\Uninstall\" Const SubKeyNameX86 = "Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\" res = "" '初期化 Set reg = CreateObject("WbemScripting.SWbemLocator") _ .ConnectServer(, "root\default").Get("StdRegProv") On Error Resume Next reg.EnumKey HKEY_LOCAL_MACHINE, SubKeyName, keys For Each key In keys display_name = "" ret = reg.GetStringValue(HKEY_LOCAL_MACHINE, SubKeyName & key, "DisplayName", display_name) If ret <> 0 Then ret = reg.GetStringValue(HKEY_LOCAL_MACHINE, SubKeyName & key, "QuietDisplayName", display_name) If (ret = 0) And (Len(Trim(display_name)) > 0) Then If InStr(LCase(display_name), LCase(AppName)) Then res = display_name Exit For End If End If Next On Error GoTo 0 '64ビットアプリケーションに無い場合は32ビットアプリケーションを検索 If (Isx64() = True) And (Len(Trim(res)) < 1) Then On Error Resume Next reg.EnumKey HKEY_LOCAL_MACHINE, SubKeyNameX86, keys For Each key In keys display_name = "" ret = reg.GetStringValue(HKEY_LOCAL_MACHINE, SubKeyNameX86 & key, "DisplayName", display_name) If ret <> 0 Then ret = reg.GetStringValue(HKEY_LOCAL_MACHINE, SubKeyNameX86 & key, "QuietDisplayName", display_name) If (ret = 0) And (Len(Trim(display_name)) > 0) Then If InStr(LCase(display_name), LCase(AppName)) Then res = display_name Exit For End If End If Next On Error GoTo 0 End If 'HKLMに無い場合はHKCUを検索 If Len(Trim(res)) < 1 Then On Error Resume Next reg.EnumKey HKEY_CURRENT_USER, SubKeyName, keys For Each key In keys display_name = "" ret = reg.GetStringValue(HKEY_CURRENT_USER, SubKeyName & key, "DisplayName", display_name) If ret <> 0 Then ret = reg.GetStringValue(HKEY_CURRENT_USER, SubKeyName & key, "QuietDisplayName", display_name) If (ret = 0) And (Len(Trim(display_name)) > 0) Then If InStr(LCase(display_name), LCase(AppName)) Then res = display_name Exit For End If End If Next On Error GoTo 0 End If IsInstalledApplication = res End Function Private Function Isx64() '64ビット環境かどうかを判別 Dim colItems Dim itm Dim ret ret = False '初期化 Set colItems = CreateObject("WbemScripting.SWbemLocator").ConnectServer.ExecQuery("Select * From Win32_OperatingSystem") For Each itm In colItems If InStr(itm.OSArchitecture, "64") Then ret = True Exit For End If Next Isx64 = ret End Function
ただし、こちらの方法で取得できるのはUninstallキー以下に情報があるアプリケーションのみになります。
この記事へのコメントはありません。