インストールされているプログラムのリストを返すVBスクリプトを微調整しようとして、多くの時間を無駄にしたことを認めたくありません。どこが間違っていたかを理解しようとしています。
私が遭遇した問題は、オンラインで見つけたすべての「リストプログラム」タイプのスクリプトが、「DisplayName」フィールドを持つすべてのキーをテキストファイルに入力することです。たくさんの検索にもかかわらず、add/removeまたはappwiz.cplに入力されたリストだけを返すものを見つけることができませんでした。これは、私が見つけた「GrabEverything」タイプのスクリプトの例です。
Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set oShell = CreateObject( "WScript.Shell" )
temp=oShell.ExpandEnvironmentStrings("%temp%")
Set objTextFile = objFSO.CreateTextFile(temp & "\software.txt", True)
strComputer = "."
strKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
strKey2 = "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\"
strEntry1a = "DisplayName"
strEntry1b = "QuietDisplayName"
Set objReg = GetObject("winmgmts://" & strComputer & _
"/root/default:StdRegProv")
objReg.EnumKey HKLM, strKey, arrSubkeys
For Each strSubkey In arrSubkeys
intRet1 = objReg.GetStringValue(HKLM, strKey & strSubkey, _
strEntry1a, strValue1)
If intRet1 <> 0 Then
objReg.GetStringValue HKLM, strKey & strSubkey, _
strEntry1b, strValue1
End If
If strValue1 <> "" Then
objTextFile.WriteLine strValue1
End If
Next
objtextfile.close
Set objTextFile = objFSO.CreateTextFile(temp & "\software.txt", True)
objReg.EnumKey HKLM, strKey2, arrSubkeys
For Each strSubkey In arrSubkeys
intRet1 = objReg.GetStringValue(HKLM, strKey2 & strSubkey, _
strEntry1a, strValue1)
If intRet1 <> 0 Then
objReg.GetStringValue HKLM, strKey & strSubkey, _
strEntry1b, strValue1
End If
If strValue1 <> "" Then
objTextFile.WriteLine strValue1
End If
Next
objtextfile.close
見つからなかったので自分で作ることにしました。Windowsがエントリを除外するために使用するフィールドを見つけるのは非常に簡単でした。「ParentDisplayName」または「SystemComponent」フィールドが含まれている場合、レジストリのアンインストールキーにリストされているすべてのキーが除外されます。私がしなければならなかったのは、上記のフィールドを含むキーをスクリーニングして、それらがObjTextFile.WriteLineに追加されないようにする方法を導入することだけでした。
私の質問は、nullであるはずの値が「1」として返されるのでしょうか?何が悪かったのか知りたいので、将来はそんなに時間を無駄にしないようにしています。
私がついに動作するようになったスクリプトはここにあります:
(テキストファイルへの送信は、除外されないように「SystemComponent」と「ParentDisplayName」の両方が「1」である必要があることに注意してください。しかし、なぜそれが「1」であり、Nullではないのかわかりません。
Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set oShell = CreateObject( "WScript.Shell" )
System=oShell.ExpandEnvironmentStrings("%systemroot%")
Set objTextFile = objFSO.CreateTextFile("installed.txt", True)
strComputer = "."
strKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
strKey2 = "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\"
strEntry1a = "DisplayName"
strEntry1b = "QuietDisplayName"
strEntry1c = "SystemComponent"
strEntry1d = "ParentDisplayName"
Set objReg = GetObject("winmgmts://" & strComputer & _
"/root/default:StdRegProv")
objReg.EnumKey HKLM, strKey, arrSubkeys
For Each strSubkey In arrSubkeys
Check1 = objReg.GetDWORDValue(HKLM, strKey & strSubkey, _
strEntry1c)
Check2 = objReg.GetStringValue(HKLM, strKey & strSubkey, _
strEntry1d)
intRet1 = objReg.GetStringValue(HKLM, strKey & strSubkey, _
strEntry1a, strValue1)
If intRet1 <> 0 Then
objReg.GetStringValue HKLM, strKey & strSubkey, _
strEntry1b, strValue1
End If
If strValue1 <> "" and check1 = 1 and check2 = 1 Then
objTextFile.WriteLine strValue1
End If
Next
If objfso.folderexists (system & "\syswow64\") then
objReg.EnumKey HKLM, strKey2, arrSubkeys
For Each strSubkey In arrSubkeys
Check1 = objReg.GetDWORDValue(HKLM, strKey2 & strSubkey, _
strEntry1c)
Check2 = objReg.GetStringValue(HKLM, strKey2 & strSubkey, _
strEntry1d)
intRet1 = objReg.GetStringValue(HKLM, strKey2 & strSubkey, _
strEntry1a, strValue1)
If intRet1 <> 0 Then
objReg.GetStringValue HKLM, strKey & strSubkey, _
strEntry1b, strValue1
End If
If strValue1 <> "" and check1 = 1 and check2 = 1 then
objTextFile.WriteLine strValue1
End If
Next
objtextfile.close
else
end if
これは私が巻き込まれた場所です。無限のバリエーションを試してみてください:
strEntry1c = "SystemComponent"
Check = objReg.GetDWORDValue(HKLM, strKey & strSubkey, _
strEntry1c)
IF isNull(Check) Then
intRet1 = objReg.GetStringValue(HKLM, strKey & strSubkey, _
strEntry1a, strValue1)