• 締切済み

プログラムの追加と削除の一覧を出力する(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

みんなの回答

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.2

>複数並べれば良いだけなのでしょうか  「良いだけ」というほど単純なことにはならないかと存じますね。  前回答の冒頭に書きましたように「配列か何かに格納するよう」にするのがよいかと存じます。  ここでは、複数ある「判定したいプログラム」の名前を 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)
回答No.1

>この結果と比較して同じ名前があれば出力する ということになると、 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

msz014234
質問者

お礼

早急な回答して頂きありがとうございます。 御教授頂いたもので判定できました。 判定したいプログラムが複数ある場合は、下記の判定を複数並べれば良いだけなのでしょうか? 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 "○○○○○○○○○○○○○はインストールされていません。"

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBSでXMLを読込、検索結果をテキスト出力

    VBSのソースについてご教授下さい。 【作りたい機能】 XMLファイルを読み込み、任意のエレメントを検索するスクリプトを VBSで作成しようとしています。 【状況】 ダイアログで表示させる方法はわかりました。  参照  http://www.atmarkit.co.jp/fxml/rensai/msxml01/msxml03.html 01 : Dim objDOM, rtResult 02 : 03 : Set objDOM = WScript.CreateObject("MSXML2.DOMDocument") 04 : rtResult = objDOM.load("Sample.xml") 05 : If rtResult = True Then 06 : procDispDatas objDOM.childNodes 07 : End If 08 : Set objDOM = Nothing 09 : 10 : Sub procDispDatas(objNode) 11 : Dim obj 12 : For Each obj In objNode 13 : If obj.nodeType = 3 and obj.parentNode.nodeName = "title" Then 14 : MsgBox obj.parentNode.nodeName & " : " & obj.nodeValue 15 : End If 16 : If obj.hasChildNodes Then 17 : procDispDatas obj.childNodes 18 : End If 19 : Next 20 : End Sub この結果をテキストファイルに出力させる方法に 困っております。 どこにどのように記載すればいいか 教えていただきたく存じます。 よろしくお願いいたします

  • win7とwin10でマクロ動作が異なる

    ノートパソコンで動作するマクロがディスクトップパソコンで動作しません。 excelマクロはoffice2010(32bit版)で、どちらも同じ。 ディスクトップパソコン:win10(64ビットオペレーティングシステム) ノートパソコン:wwin7(32ビットオペレーティングシステム) です。 動作させたマクロは、webに掲載されていたものを参考にA列へ名称記載を追加したものです。 Sub get_application() 'インストールされているアプリケーション一覧を取得するVBAマクロ Dim reg As Object Dim keys As Variant Dim key As Variant Dim ret As Long Dim display_name As String Const HKEY_LOCAL_MACHINE = &H80000002 Const SubKeyName = "Software\Microsoft\Windows\CurrentVersion\Uninstall\" Set reg = CreateObject("WbemScripting.SWbemLocator") _ .ConnectServer(, "root\default").Get("StdRegProv") reg.EnumKey HKEY_LOCAL_MACHINE, SubKeyName, keys On Error Resume Next i = 1 For Each key In keys display_name = "" ret = reg.GetStringValue(HKEY_LOCAL_MACHINE, SubKeyName & key, "DisplayName", display_name) If (ret = 0) And (Len(Trim(display_name)) > 0) Then ret = reg.GetStringValue(HKEY_LOCAL_MACHINE, SubKeyName & key, "QuietDisplayName", display_name) If Len(Trim(display_name)) > 0 Then Debug.Print display_name Cells(i, 1) = display_name i = i + 1 End If Next On Error GoTo 0 End Sub win7だと上記マクロで動作するのですが、win10だとエラーがでるわけでもなく、だんまり状態となります。 If (ret = 0) And (Len(Trim(display_name)) > 0) Then ret = reg.GetStringValue(HKEY_LOCAL_MACHINE, SubKeyName & key, "QuietDisplayName", display_name) の部分を削除すると、win7,win10共に動作します。 win7では、上記削除した部分の有無でマクロの実行結果は同じです。 なので、とりあえず、マクロ動作に関しては、不要で解決できているのですが、 何故win7で動作するマクロが、win10では、だんまりになるのか、 また、どういった処理なのかを、解説お願いできますでしょうか?

  • VBS でプログラムを先頭から再試行

    VBSの実行中に、プログラムを先頭から再試行させるにはどうしたらいいですか? 2重起動ではなく、あくまでプログラム自身のリスタートです。 処理 A num = msgbox ("プログラムの再試行",5) if num = 4 then '再試行が押されたなら リスタート else 'キャンセルなら WScript.Quit end if 処理 B 上記の「リスタート」の部分の記述をお願いします。

  • WMIスクリプトを使用してMACアドレスをASPで取得

    タイトルの通りですが、 WMIスクリプトを使用して、 ASPでMACアドレスの取得を行なっているのですが、 なかなか上手くいきません。 <%@ LANGUAGE="VBSCRIPT"%> <HTML> <HEAD> </HEAD> <BODY> <% Dim QfeSet Dim QfeSets Dim Qfe Dim Locator Dim Service Dim Ret on error resume next Set Locator = CreateObject("WbemScripting.SWbemLocator") Set Service = Locator.ConnectServer If Err = 0 then Set QfeSet = Service.Get("Win32_NetworkAdapterConfiguration") QfeSet.Security_.impersonationLevel = impersonate Set QfeSets = QfeSet.Instances_ End If For Each Qfe In QfeSet If Qfe.IPEnabled = True Then Ret = Qfe.MACAddress & vbCrLf Response.write("MACADDRESS:" & Ret & "<BR>") End If Next %> </BODY> </HTML> CreateObjectやService.Getのところが 原因ではないかと思うのですが・・・。 どなたか教えて戴けますでしょうか? 宜しくお願い致します。

  • (VBA)RegDeleteKeyがエラー

    RegDeleteKeyについて教えてください ○削除するレジストリHKEY_LOCAL_MACHINE\SOFTWARE\XTSEGRSCESK\AAA ○ソース Public Const HKEY_LOCAL_MACHINE = &H80000002 Dim lRootKey As Long Dim sSubKey As String Dim lRet As Long lRootKey = HKEY_LOCAL_MACHINE sSubKey = "SOFTWARE\XTSEGRSCESK\AAA" lRet = RegDeleteKey(lRootKey, sSubKey) ○結果 RegDeleteKeyの戻り値が2 どこが悪いか教えてください お願いします

  • VBSでレジストリキー名に円マークをつける

    「SQL\INSTANCE」という名前のキーをレジストリに作成したいのですが、円マークを入れると階層化されてしまうので、困っています。 カンタンな質問かもしれませんがどなたか教えてください。 以下、VBSで作成 Option Explicit On Error Resume Next Dim objWshShell ' WshShell オブジェクト Set objWshShell = WScript.CreateObject("WScript.Shell") If Err.Number = 0 Then objWshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\SQL\INSTANCE", "SQL", "REG_SZ" WScript.Echo "ODBC設定変更:完了" Else WScript.Echo "エラー: " & Err.Description End If Set objWshShell = Nothing

  • VBSでのファイル読込、出力操作について

    いつもありがとうございます。 掲題の件について、ご教授頂けますでしょうか。 下記のように『start.vbs』を実行すると『a.txt』の行に記載されている実行ファイル名を読み込み 『test.vbs』にファイル名分のコマンドを書き込みしたいです。 例) ----------------------------- start.vbs (作成途中) ----------------------------- Set objWShell = CreateObject("wscript.shell") Set objFso = CreateObject("Scripting.FileSystemObject") Set objFile = objFso.OpenTextFile("c:\a.txt", 1, False) ' 出力先ファイル Set objVBSFile = objFSO.CreateTextFile(c:\test.vbs, True) If Err.Number > 0 Then WScript.Echo "Open Error" Else Do Until objFile.AtEndOfStream objVBSFile.WriteLine(objFile.ReadLine) Loop End If ----------------------------- a.txt ----------------------------- adobe.exe photoshop.exe ****.exe    ・    ・    ・ ------------------------------ start.vbs ------------------------------ objWShell.Run "cmd.exe c:\adobe.exe ", 0, True objWShell.Run "cmd.exe c:\photoshop.exe ", 0, True objWShell.Run "cmd.exe c:\****.exe ", 0, True    ・    ・    ・ vbsをサイトを参考にして作ってはいるものの、start.vbsを実行すると a.txtのファイル名をvbsに書き込むのが限界です。 少しずつ勉強していくのですが、本件少し早めに作りたいという背景があり ご教授頂けませんでしょうか。 また、わかりにくい説明となっておりますが どうぞ宜しくお願い致します。

  • VBSについて教えてください。

    VBSについて教えてください。 イベントビューワのプロパティの変更(最大ログサイズとログサイズが最大値に達した時の操作)を以下のスクリプトにて変更したいと思っています。(スクリプトはhttp://www.microsoft.com/japan/technet/scriptcenter/scripts/logs/eventlog/lgevvb16.mspxで公開されているのを利用しています。) strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate,(Security)}!\\" & _ strComputer & "\root\cimv2") Set colLogFiles = objWMIService.ExecQuery _ ("Select * from Win32_NTEventLogFile") For each objLogfile in colLogFiles strLogFileName = objLogfile.Name Set wmiSWbemObject = GetObject _ ("winmgmts:{impersonationLevel=Impersonate}!\\.\root\cimv2:" _ & "Win32_NTEventlogFile.Name='" & strLogFileName & "'") wmiSWbemObject.MaxFileSize = 1024000 wmiSWbemObject.OverwriteOutdated = 0 wmiSWbemObject.Put_ Next WindowsXPSP2では動作したのですが、Windows2000SP4では以下のエラーが発生します。 Windows Script Host スクリプト:スクリプトの場所 行:14 文字:5 エラー:WBEM_FLAG_USE_AMENDED_QUALIFIERSが指定されていない場合は修正オブジェクトを置くことはできません コード:80041066 ソース:SWbemObject VBSについては全く理解できておりません。 Windows2000で動作させるためにんはどこを修正すればいいでしょうか?

  • VBSからリモートでbat実行(WMI)

    VBS初心者です。 別端末上のbatファイルを別ユーザでリモート実行したいのですが、 以下のソースでエラーが起きてしまいます。(result が2で返ってきてしまう) どなたか原因がお解りになりましたらご教授宜しくお願い致します。 ----------------------------------------------------- RemoteExecute "リモート先","ドメイン\User","pass","C:\test.bat" Function RemoteExecute(strServer, strUser, strPassword, CmdLine) Const Impersonate = 3 RemoteExecute = -1 Set Locator = CreateObject("WbemScripting.SWbemLocator") Set Service = Locator.ConnectServer(strServer, "root\cimv2", strUser, strPassword) Service.Security_.ImpersonationLevel = Impersonate Set Process = Service.Get("Win32_Process") result = Process.Create(CmdLine, , , ProcessId) If (result <> 0) Then WScript.Echo "Creating Remote Process Failed: " & result Wscript.Quit End If RemoteExecute = ProcessId End Function -----------------------------------------------------

  • vbsで最後の行を削除する

    csvファイル(test.csv)からフラグが1のものを抽出するのですが 最終行に改行がはってしまうので、最終行を削除してcsvファイルを保存したいのですが、 うまくいきません。ご教授ください。 Dim objADO Dim i Dim wsql Dim rs Dim wHeader Dim wData Dim objFSO Dim objFile Set objADO = CreateObject('ADODb.connection') objADO.Open "Driver={Microsoft Text Driver (*.txt;*csv)};"&_ "DBQ=C:\test;"&_ "ReadOnly=1" '抽出条件 wsql="select * from test.csv where フラグ='1'" Set rs =objADO.Execute(Wsql) 'ヘッダ部 wHeader='ID,商品名,商品番号,フラグ" 'データ部 wData="" Do While rs.EOF=False For i = 0 to rs.fields.count - 1 if i = (rs.fields.count -1) then wData = wData & chr(34) & rs.Fields.ltem(i) & chr(34) & chr(13) else wData = wData & chr(34) & rs.Fields.ltem(i) & chr(34) & "," end if next rs.MoveNext loop '最終改行削除? rs = Left(wData,Len(wData) - Len(chr(13))) 'ファイル出力 set objFSO = createObject("Scripting.FileSystemObject") set objFile = objFSO.OpentextFile("c:\test\test.csv",2, true) if err.Number = 0 then objFile.WriteLine(wHeader) objFile.WriteLine(wData) objFile.close end if set objFile = Nothing set objFSO = Nothing set objADO = Nothing ****************************************** ID,商品名,商品番号,フラグ 100,パソコン,100-12,1 200,ペン,200-11,1 ***ここの改行を削除する***** 〔EOF〕