2011-02-18 58 views
2

此腳本的工作原理和告訴程序文件中安裝了什麼。重複數據刪除和過濾添加/刪除程序列表(VBScript)

兩個問題

重複行

AVG 2011版本:10.0.1204

AVG 2011版本:10.0.1204安裝:27/01/2011

我不想包含有關鍵詞「更新」,「修補程序」,「Java」可以讓任何VB大師在那裏幫助這個腳本需要額外的東西嗎?

Option Explicit 

Dim sTitle 
sTitle = "Installed Programs on your PC -" 
Dim StrComputer 

strComputer = Trim(strComputer) 
If strComputer = "" Then strComputer = "." 

'Wscript.Echo GetAddRemove(strComputer) 

Dim sCompName : sCompName = GetProbedID(StrComputer) 

Dim sFileName 
sFileName = sCompName & "_" & GetDTFileName() & "_Software.txt" 

Dim s : s = GetAddRemove(strComputer) 

If WriteFile(s, sFileName) Then 
    'optional prompt for display 
    If MsgBox("Finished processing. Results saved to " & sFileName & _ 
      vbcrlf & vbcrlf & "Do you want to view the results now?", _ 
      4 + 32, sTitle) = 6 Then 
    WScript.CreateObject("WScript.Shell").Run sFileName, 9 
    End If 
End If 

Function GetAddRemove(sComp) 
    'Function credit to Torgeir Bakken 
    Dim cnt, oReg, sBaseKey, iRC, aSubKeys 
    Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE 
    Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ 
       sComp & "/root/default:StdRegProv") 
    sBaseKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" 
    iRC = oReg.EnumKey(HKLM, sBaseKey, aSubKeys) 

    Dim sKey, sValue, sTmp, sVersion, sDateValue, sYr, sMth, sDay 

    For Each sKey In aSubKeys 
    iRC = oReg.GetStringValue(HKLM, sBaseKey & sKey, "DisplayName", sValue) 
    If iRC <> 0 Then 
     oReg.GetStringValue HKLM, sBaseKey & sKey, "QuietDisplayName", sValue 
    End If 
    If sValue <> "" Then 
     iRC = oReg.GetStringValue(HKLM, sBaseKey & sKey, _ 
           "DisplayVersion", sVersion) 
     If sVersion <> "" Then 
     sValue = sValue & vbTab & "Ver: " & sVersion 
     Else 
     sValue = sValue & vbTab 
     End If 
     iRC = oReg.GetStringValue(HKLM, sBaseKey & sKey, _ 
           "InstallDate", sDateValue) 
     If sDateValue <> "" Then 
     sYr = Left(sDateValue, 4) 
     sMth = Mid(sDateValue, 5, 2) 
     sDay = Right(sDateValue, 2) 
     'some Registry entries have improper date format 
     On Error Resume Next 
     sDateValue = DateSerial(sYr, sMth, sDay) 
     On Error GoTo 0 
     If sdateValue <> "" Then 
      sValue = sValue & vbTab & "Installed: " & sDateValue 
     End If 
     End If 
     sTmp = sTmp & sValue & vbcrlf 
    cnt = cnt + 1 
    End If 
    Next 
    sTmp = BubbleSort(sTmp) 
    GetAddRemove = "INSTALLED SOFTWARE (" & cnt & ") - " & sCompName & _ 
       " - " & Now() & vbcrlf & vbcrlf & sTmp 
End Function 

Function BubbleSort(sTmp) 
    'cheapo bubble sort 
    Dim aTmp, i, j, temp 
    aTmp = Split(sTmp, vbcrlf) 
    For i = UBound(aTmp) - 1 To 0 Step -1 
    For j = 0 to i - 1 
     If LCase(aTmp(j)) > LCase(aTmp(j+1)) Then 
     temp = aTmp(j + 1) 
     aTmp(j + 1) = aTmp(j) 
     aTmp(j) = temp 
     End if 
    Next 
    Next 
    BubbleSort = Join(aTmp, vbcrlf) 
End Function 

Function GetProbedID(sComp) 
    Dim objWMIService, colItems, objItem 
    Set objWMIService = GetObject("winmgmts:\\" & sComp & "\root\cimv2") 
    Set colItems = objWMIService.ExecQuery("Select SystemName from " & _ 
             "Win32_NetworkAdapter",,48) 
    For Each objItem in colItems 
    GetProbedID = objItem.SystemName 
    Next 
End Function 

Function GetDTFileName() 
    dim sNow, sMth, sDay, sYr, sHr, sMin, sSec 
    sNow = Now 
    sMth = Right("0" & Month(sNow), 2) 
    sDay = Right("0" & Day(sNow), 2) 
    sYr = Right("00" & Year(sNow), 4) 
    sHr = Right("0" & Hour(sNow), 2) 
    sMin = Right("0" & Minute(sNow), 2) 
    sSec = Right("0" & Second(sNow), 2) 
    GetDTFileName = sMth & sDay & sYr & "_" & sHr & sMin & sSec 
End Function 

Function WriteFile(sData, sFileName) 
    Dim fso, OutFile, bWrite 
    bWrite = True 
    Set fso = CreateObject("Scripting.FileSystemObject") 
    On Error Resume Next 
    Set OutFile = fso.OpenTextFile(sFileName, 2, True) 
    'Possibly need a prompt to close the file and one recursion attempt. 
    If Err = 70 Then 
    Wscript.Echo "Could not write to file " & sFileName & ", results " & _ 
       "not saved." & vbcrlf & vbcrlf & "This is probably " & _ 
       "because the file is already open." 
    bWrite = False 
    ElseIf Err Then 
    WScript.Echo err & vbcrlf & err.description 
    bWrite = False 
    End If 
    On Error GoTo 0 
    If bWrite Then 
    OutFile.WriteLine(sData) 
    OutFile.Close 
    End If 
    Set fso = Nothing 
    Set OutFile = Nothing 
    WriteFile = bWrite 
End Function 
+2

好奇鍵開始downvote。 +1爲平衡,因爲我看到很多較差的問題。 – 2011-02-18 12:11:30

+4

我可以幫忙,但因爲我不是JEDI的主人,所以我不得不拒絕。 – 2011-02-18 12:18:25

回答

2

@icecurtain:你問題的第二部分可以使用InStr來解決由@Oliver的建議,改寫以適應你的腳本它會是什麼樣子 -

If sValue <> "" _ 
    AND (InStr(1, sValue, "Hotfix", 1)) = 0 _ 
    AND (InStr(1, sValue, "Update", 1)) = 0 _ 
    AND (InStr(1, sValue, "Java", 1)) = 0) Then 

第一部分就不會那麼如果發現包含版本和安裝日期(其中一些重複部分只包含部分內容或根本不包含內容),這一技巧就很棘手。如果沒有包含額外的數據位,則可以循環遍歷所有行,並使用.Exists檢查將它們添加到Scripting.Dictory對象中,以防止添加副本。

1

好吧,即使我不是一個絕地大師(或沒有自尊;-)),這可以幫助你:

If InStr(1, sValue, "hotfix", vbTextCompare) = 0 Then 
    Print "This is NOT a hotfix" 
End If 

如需進一步信息只是看看MSDN page for InStr()

0

我不認爲硬編碼字符串檢查是要走的路,一個卸載項是一個更新,如果任何的這些都是真的:

  • 它有一個名爲SystemComponent DWORD值,<> 0
  • 命名ParentKeyName
  • 註冊表中的字符串值的子帶 「KB」 或 「Q」 + 6個號碼(KB ######,Q ######)