Имя: Пароль:
1C
 
1С+WMI Помогите кто чем может.... не могу перебрать коллекцию
Ø
0 дядя Вася
 
04.04.05
12:18
Locator=СоздатьОбъект("WbemScripting.SWbemLocator");
Компьютер = Locator.ConnectServer(СетевоеИмя);
Коллекция = Компьютер.ExecQuery("Select * from Win32_Product");
вопрос в том, как пройтись по коллекции?
Метод Item почему-то не работает.....
HELP......
1 Денис2
 
04.04.05
12:19
А такой метод есть? Если нет, то только V8 и для каждого...
2 Палыч
 
04.04.05
12:35
SWbemObjectSet.Item(strObjectPath)
strObjectPath - путь к объекту в виде строки.
Так что только через скрипт.
3 Gloom
 
04.04.05
12:44
В данном случае лучше WindowsInstaller юзать - и проще, и шустрее...
4 slavka
 
04.04.05
12:53
Мож это чем поможет:
Const wbemImpersonationLevelDelegate = 4
Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objConnection = objwbemLocator.ConnectServer _
    ("WebServer", "root\cimv2", "fabrikam\administrator", _
     "password", , "kerberos:WebServer")
objConnection.Security_.ImpersonationLevel = wbemImpersonationLevelDelegate
Set objSoftware = objConnection.Get("Win32_Product")
errReturn = objSoftware.Install("\\atl-dc-02\scripts\1561_lab.msi",,True)
Wscript.Echo errReturn
5 дядя Вася
 
04.04.05
12:57
(4)Мне нужно получить список установленного ПО. Но т.к. нету For Each ... в 1С сделать этого не могу.
6 slavka
 
04.04.05
13:01
(5) ну тады мож это:
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
или вот это:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colFeatures = objWMIService.ExecQuery _
    ("Select * from Win32_SoftwareFeature")
For each objFeature in colfeatures
    Wscript.Echo "Accesses: " & objFeature.Accesses
    Wscript.Echo "Attributes: " & objFeature.Attributes
    Wscript.Echo "Caption: " & objFeature.Caption
    Wscript.Echo "Description: " & objFeature.Description
    Wscript.Echo "Identifying Number: " & objFeature.IdentifyingNumber
    Wscript.Echo "Install Date: " & objFeature.InstallDate
    Wscript.Echo "Install State: " & objFeature.InstallState
    Wscript.Echo "LastUse: " & objFeature.LastUse
    Wscript.Echo "Name: " & objFeature.Name
    Wscript.Echo "ProductName: " & objFeature.ProductName
    Wscript.Echo "Vendor: " & objFeature.Vendor
    Wscript.Echo "Version: " & objFeature.Version
Next
7 дядя Вася
 
04.04.05
13:57
(6) ты это в 1С напиши. Там цикла FOR EACH нету..............
8 slavka
 
04.04.05
14:02
а ты из 1С можешь скрипт запустить. В скрипте скидывать в текстовый файл и уже из 1С парсить ентот файлик слабо? :)
9 Gloom
 
04.04.05
14:03
(7)Если надо только локально работать - см.(3)...
10 дядя Вася
 
04.04.05
14:09
всем спасибо....
11 Палыч
 
04.04.05
14:10
(0) Вот тебе индексатор словаря:
функция getIndexed(dic)
  перем
    sc
  ;
  
  sc = СоздатьОбъект("MSScriptControl.ScriptControl");
  sc.Language = "JScript";
  sc.AddCode("
    |function getIndexed(dic)
    |{
    | var
    | e = new Enumerator(dic),
    | coll = new ActiveXObject(""Scripting.Dictionary"")
    | ;
    |
    | for (i = 1; !e.atEnd(); e.moveNext(), i++) coll.Add(i, e.item());
    |
    | return coll;
    |}
    |"
  );
  
  
  возврат sc.Modules("Global").CodeObject.getIndexed(dic);
  
конецФункции
12 дядя Вася
 
04.04.05
14:32
11) Дай бог тебе здоровья и хорошую любовницу
13 SiAl
 
04.04.05
14:55
(0) Я конечно не очень силен в объектной технике, но обычно у всех коллекций есть метод, возвращающий количество элементов и метод, получающий элемент коллекции по индексу. Может порыть в этом направлении, что то вроде Count и Item. Надо только помнить что коллеция нумеруется с нуля.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший