Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Windows > Сортировка в WQL-запросе


Автор: YURETS 15.5.2008, 21:32
Добрый день.
Подскажите пожалуйста как в WQL-запросе указать тип сортировки.
Нужно что-то типа такого :
Set colSoftware = objWMIService.ExecQuery ("Select * from Win32_Product order by Caption")

Цель - получить при помощи VB-скрипта список установленного ПО в таком виде как он выглядит в установке и удалении программ.

И еще, почему при запросе класса Win32_Product выводится неполный список установленного в системе ПО а только установленного с помощью MSI-ек.


Автор: mihanik 15.5.2008, 21:40
Т.е. скрипт типа того, что указан ниже, тебя не устраивает?

Код

' List Installed Software

' Windows Server 2003 : Yes
' Windows XP : Yes
' Windows 2000 : Yes
' Windows NT 4.0 : Yes
' Windows 98 : Yes

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.CreateTextFile("c:\scripts\software.tsv", True)

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colSoftware = objWMIService.ExecQuery _
    ("Select * from Win32_Product")

objTextFile.WriteLine "Caption" & vbtab & _
    "Description" & vbtab & "Identifying Number" & vbtab & _
    "Install Date" & vbtab & "Install Location" & vbtab & _
    "Install State" & vbtab & "Name" & vbtab & _ 
    "Package Cache" & vbtab & "SKU Number" & vbtab & "Vendor" & vbtab _
        & "Version" 

For Each objSoftware in colSoftware
    objTextFile.WriteLine objSoftware.Caption & vbtab & _
    objSoftware.Description & vbtab & _
    objSoftware.IdentifyingNumber & vbtab & _
    objSoftware.InstallDate2 & vbtab & _
    objSoftware.InstallLocation & vbtab & _
    objSoftware.InstallState & vbtab & _
    objSoftware.Name & vbtab & _
    objSoftware.PackageCache & vbtab & _
    objSoftware.SKUNumber & vbtab & _
    objSoftware.Vendor & vbtab & _
    objSoftware.Version
Next
objTextFile.Close


Добавлено через 1 минуту и 46 секунд
а такой?

Код

' List All Installed Software

' Windows Server 2003 : Yes
' Windows XP : Yes
' Windows 2000 : Yes
' Windows NT 4.0 : Yes
' Windows 98 : Yes


Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE
strComputer = "."
strKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
strEntry1a = "DisplayName"
strEntry1b = "QuietDisplayName"
strEntry2 = "InstallDate"
strEntry3 = "VersionMajor"
strEntry4 = "VersionMinor"
strEntry5 = "EstimatedSize"

Set objReg = GetObject("winmgmts://" & strComputer & _
 "/root/default:StdRegProv")
objReg.EnumKey HKLM, strKey, arrSubkeys
WScript.Echo "Installed Applications" & VbCrLf
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
    WScript.Echo VbCrLf & "Display Name: " & strValue1
  End If
  objReg.GetStringValue HKLM, strKey & strSubkey, _
   strEntry2, strValue2
  If strValue2 <> "" Then
    WScript.Echo "Install Date: " & strValue2
  End If
  objReg.GetDWORDValue HKLM, strKey & strSubkey, _
   strEntry3, intValue3
  objReg.GetDWORDValue HKLM, strKey & strSubkey, _
   strEntry4, intValue4
  If intValue3 <> "" Then
     WScript.Echo "Version: " & intValue3 & "." & intValue4
  End If
  objReg.GetDWORDValue HKLM, strKey & strSubkey, _
   strEntry5, intValue5
  If intValue5 <> "" Then
    WScript.Echo "Estimated Size: " & Round(intValue5/1024, 3) & " megabytes"
  End If
Next


Добавлено через 4 минуты и 34 секунды
Копай в MSDN.
Классная "вестщь"!!!

Активно пользуюсь, чего и тебе желаю...

Автор: YURETS 15.5.2008, 21:50
В этом скрипте список не отсортирован и не всё ПО.
Но опять-таки в него попадают некоторые хотфиксы и нет сортировки в алфавитном порядке.
Хотелось бы получить список как в установке и удалении.

У меня сейчас работает такой  скрипт:
Код

strKeyPath = "Software\Microsoft\Windows\CurrentVersion\Uninstall"  
strInfo = " "
sbbkey = ""
strValue = ""
strValue2 = ""
BinarValue = 0
strValueName = "DisplayName"
strValueName2 = "DisplayVersion"
strValueName3 = "UninstallString"
strValueName4 = "SystemComponent"
strValueName5 = "ParentDisplayName"
oReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys  
strInfo=strInfo + vbCrLf+  "Список установленного ПО Полный список !!!"  
strInfo=strInfo + vbCrLf+  "===================="  
For Each subkey In arrSubKeys
if Left(subkey,2) <> "KB"  Then
     sbbkey = strKeyPath & "\" & subkey
     intRes = oReg.GetDWORDValue(HKEY_LOCAL_MACHINE,sbbkey,strValueName4,BinarValue)
     intRes2 = oReg.GetStringValue(HKEY_LOCAL_MACHINE,sbbkey,strValueName5,strValue2)
if (intRes <> 0) and (intRes2 <> 0)  Then
       oReg.GetStringValue HKEY_LOCAL_MACHINE,sbbkey,strValueName,strValue
 if strValue <> nul then
                               strInfo=strInfo + vbCrLf + strValue
       oReg.GetStringValue HKEY_LOCAL_MACHINE,sbbkey,strValueName2,strValue
            if strValue <> nul then
                               strInfo=strInfo + "    |-=Версия-> " + strValue
            else
                               strInfo=strInfo + "    |-=Версия->None"
            end if
       oReg.GetStringValue HKEY_LOCAL_MACHINE,sbbkey,strValueName3,strValue
            if strValue <> nul then
                               strInfo=strInfo + "    |-=Строка удаления-> " + strValue
            else
                               strInfo=strInfo + "    |-=Строка удаления->None "
            end if
 else
     if BinarValue <> 1 Then
                             objTextFile.WriteLine "Системный компонент не 1 ->" & sbbkey
     end if
 end if
else
  if (intRes2 = 0) and ((strValue2 = "") or (strValue2 = "Windows XP - Software Updates"))  Then
       oReg.GetStringValue HKEY_LOCAL_MACHINE,sbbkey,strValueName,strValue
       if strValue <> nul then
                               strInfo=strInfo + vbCrLf + strValue
       oReg.GetStringValue HKEY_LOCAL_MACHINE,sbbkey,strValueName2,strValue
            if strValue <> nul then
                               strInfo=strInfo + "    |-=Версия-> " + strValue
            else
                               strInfo=strInfo + "    |-=Версия->None"
            end if
       oReg.GetStringValue HKEY_LOCAL_MACHINE,sbbkey,strValueName3,strValue
            if strValue <> nul then
                               strInfo=strInfo + "    |-=Строка удаления-> " + strValue
            else
                               strInfo=strInfo + "    |-=Строка удаления->None "
            end if
       else
                     if BinarValue <> 1 Then
                             objTextFile.WriteLine "Системный компонент не 1 ->" & sbbkey
                     end if
      end if
  end if
end if
end if
Next  

Автор: redman1986 16.5.2008, 10:21
если почитать MSDN то там написано что класс Win32_Product дает только ПО установленное с использованием установщика WindowsInstaller... большего из этого класса невыжать (по работе сталкивался с такой проблемой ).... выход только в одном лезть в реестр, как советует mihanik. и делать алгоритм нужной работы...  я так и делал....

Автор: YURETS 22.5.2008, 21:06
А есть ли в VBS какие-нибудь стандартные алгоритмы сортировки массивов ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)