- 締切済み
プログラムの追加と削除の一覧を出力する(MS更新パッチは除く)Vbsを
プログラムの追加と削除の一覧を出力する(MS更新パッチは除く)Vbsを作成したのですがこの結果と比較して同じ名前があれば出力するVbsを追記で作成したいのですが御教授下さい。 例:InternetExploerはインストールされています。 ※ちゃんとインストールされているかの判定で使うのが目的です。 Option Explicit Const HKEY_LOCAL_MACHINE = &H80000002 Dim objRegProv, ccSubKeys Dim strComputer, sytKey, strSubKey, dwVal Dim strDisplayName, strParentKeyName, dwSystemComponent strComputer = "." Set objRegProv = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv") sytKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" Call objRegProv.EnumKey(HKEY_LOCAL_MACHINE, sytKey, ccSubKeys) For each strSubKey in ccSubKeys dwVal = objRegProv.GetStringValue(HKEY_LOCAL_MACHINE, sytKey & "\" & strSubKey, "ParentKeyName", strParentKeyName) If dwVal <> 0 Then ' ParentKeyNameが無いものが対象(更新インストールではないもの) dwVal = objRegProv.GetDWORDValue(HKEY_LOCAL_MACHINE, sytKey & "\" & strSubKey, "SystemComponent", dwSystemComponent) If dwVal <> 0 Or dwSystemComponent = 0 Then ' システムフラグが無いまたはゼロのものが対象 dwVal = objRegProv.GetStringValue(HKEY_LOCAL_MACHINE, sytKey & "\" & strSubKey, "DisplayName", strDisplayName) If dwVal = 0 And strDisplayName <> "" Then ' 表示名があるものが対象 WScript.Echo strDisplayName End If End If End If Next
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- DOUGLAS_
- ベストアンサー率74% (397/534)
>複数並べれば良いだけなのでしょうか 「良いだけ」というほど単純なことにはならないかと存じますね。 前回答の冒頭に書きましたように「配列か何かに格納するよう」にするのがよいかと存じます。 ここでは、複数ある「判定したいプログラム」の名前を AppList という配列に格納し、strDisplayName を取得した タイミング で AppLis の文字列を キー とする objSD という [Dictionary オブジェクト] に格納してみました。 最後に、AppList の要素を一つずつ objSD の キー文字列 として代入してみて、objSD が Empty の場合には「インストールされていません」という判別になるようにしてみました。 もっとスッキリした コーディング もあろうかと存じますので、飽くまで一例ということでご参考に供します。 なお、今回は、ご質問文内にお示しの コード をそのまま利用しておりますので、それと今回答との差分を比較してご覧ください。 Option Explicit Const HKEY_LOCAL_MACHINE = &H80000002 Dim objRegProv, ccSubKeys Dim strComputer, sytKey, strSubKey, dwVal Dim strDisplayName, strParentKeyName, dwSystemComponent Dim AppList, objSD, i, strRes AppList = Array("Internet Explorer", "Adobe Reader", "Microsoft Office", "hogehoge") Set objSD = CreateObject("Scripting.Dictionary") strComputer = "." Set objRegProv = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv") sytKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" Call objRegProv.EnumKey(HKEY_LOCAL_MACHINE, sytKey, ccSubKeys) For Each strSubKey In ccSubKeys dwVal = objRegProv.GetStringValue(HKEY_LOCAL_MACHINE, sytKey & "\" & strSubKey, "ParentKeyName", strParentKeyName) If dwVal <> 0 Then ' ParentKeyNameが無いものが対象(更新インストールではないもの) dwVal = objRegProv.GetDWORDValue(HKEY_LOCAL_MACHINE, sytKey & "\" & strSubKey, "SystemComponent", dwSystemComponent) If dwVal <> 0 Or dwSystemComponent = 0 Then ' システムフラグが無いまたはゼロのものが対象 dwVal = objRegProv.GetStringValue(HKEY_LOCAL_MACHINE, sytKey & "\" & strSubKey, "DisplayName", strDisplayName) If dwVal = 0 And strDisplayName <> "" Then ' 表示名があるものが対象 'WScript.Echo strDisplayName For i = 0 To UBound(AppList) If InStr(strDisplayName, AppList(i)) > 0 Then objSD(AppList(i)) = strDisplayName & " はインストールされています。" End If Next End If End If End If Next For i = 0 To UBound(AppList) If objSD(AppList(i)) = "" Then objSD(AppList(i)) = AppList(i) & " はインストールされていません。" strRes = strRes & objSD(AppList(i)) & vbCrLf Next WScript.Echo strRes
- DOUGLAS_
- ベストアンサー率74% (397/534)
>この結果と比較して同じ名前があれば出力する ということになると、 WScript.Echo strDisplayName で吐き出している「strDisplayName」を配列か何かに格納するようなことになって面倒かと存じます。 >ちゃんとインストールされているかの判定で使うのが目的 とのことですので、「InternetExploer」を発見した タイミング でそれを出力するというのはいかがでしょうか? Option Explicit Const HKEY_LOCAL_MACHINE = &H80000002 Dim objRegProv, ccSubKeys Dim strComputer, sytKey, strSubKey, dwVal Dim strDisplayName, strParentKeyName, dwSystemComponent Dim flag strComputer = "." Set objRegProv = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv") sytKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" Call objRegProv.EnumKey(HKEY_LOCAL_MACHINE, sytKey, ccSubKeys) For Each strSubKey In ccSubKeys dwVal = objRegProv.GetStringValue(HKEY_LOCAL_MACHINE, sytKey & "\" & strSubKey, "DisplayName", strDisplayName) If dwVal = 0 And strDisplayName <> "" Then ' 表示名があるものが対象 If InStr(strDisplayName, "Internet Explorer") > 0 Then flag = 1 WScript.Echo strDisplayName & " はインストールされています。" Exit For End If End If Next If flag = 0 Then WScript.Echo "Internet Explorer はインストールされていません。" End If
お礼
早急な回答して頂きありがとうございます。 御教授頂いたもので判定できました。 判定したいプログラムが複数ある場合は、下記の判定を複数並べれば良いだけなのでしょうか? If dwVal = 0 And strDisplayName <> "" Then ' 表示名があるものが対象 If InStr(strDisplayName, "○○○○○○○○○○○○○") > 0 Then flag = 1 WScript.Echo strDisplayName & " はインストールされています。" Exit For End If End If Next If flag = 0 Then WScript.Echo "○○○○○○○○○○○○○はインストールされていません。"