Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Задать массив и цикл (http://forum.oszone.net/showthread.php?t=238360)

HFShak 11-07-2012 10:05 1949773

Задать массив и цикл
 
Добрый день!
Есть такой скрипт:
Код:

$strComputer = "."
$strSoftwareName = "Java(TM) 7 Update 5"

;Start Uninstall Script
$objWMIService = ObjGet("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
$colSoftware = $objWMIService.ExecQuery _
("Select * from Win32_Product Where Name = '" & $strSoftwareName & "'")
For $objSoftware in $colSoftware
$objSoftware.Uninstall()
Next

Смысл скрипта: если существует программа "Java(TM) 7 Update 5" в классе Win32_Product, то запускается ее удаление.
Помогите сделать так, чтобы: переменная $strSoftwareName состояла из множества имен, т.е. была массивом (желательно поудобнения для записи, чтобы можно было менять имена или дописывать), а в цикле эти имена перебирались..

Iska 11-07-2012 11:35 1949815

Например, так (не проверялось):
Код:

AutoItSetOption("MustDeclareVars", 1)

Local $aSoftwareNames[3]  = ["Java(TM) 7 Update 5", "Java(TM) 7 Update 6", "Java(TM) 7 Update 7"]
Local $sSoftwareName

Local $sComputer = "."

Local $oSWbemLocator    = ObjCreate("WbemScripting.SWbemLocator")
Local $oSWbemServicesEx = $oSWbemLocator.ConnectServer($sComputer, "root\cimv2")
Local $cSWbemObjectSet  = $oSWbemServicesEx.ExecQuery("SELECT * FROM Win32_Product")
Local $oSWbemObjectEx

For $oSWbemObjectEx In $cSWbemObjectSet
        For $sSoftwareName In $aSoftwareNames
                If $sSoftwareName = $oSWbemObjectEx.Name Then
                        $oSWbemObjectEx.Uninstall()
                EndIf
        Next
Next

$oSWbemObjectEx  = 0
$cSWbemObjectSet  = 0
$oSWbemServicesEx = 0
$oSWbemLocator    = 0

Exit(0)


HFShak 11-07-2012 11:55 1949826

Ага, работает, спасибо.

HFShak 11-07-2012 14:51 1949955

Не знаете, почему может возникать данная проблема?

"Error: The requested action with this object has failed"

Код:

AutoItSetOption("MustDeclareVars", 1)

Local $aSoftwareNames[40] = [ _
"Java 2 Runtime Environment Standard Edition v1.2.2", _
"Java 2 Runtime Environment Standard Edition v1.3.1_05", _
"Java 2 Runtime Environment Standard Edition v1.3.1_17", _
"Java 2 Runtime Environment, SE v1.4.2_01", _
"Java 2 Runtime Environment, SE v1.4.2_03", _
"Java 2 Runtime Environment, SE v1.4.2_05", _
"Java 2 Runtime Environment, SE v1.4.2_06", _
"Java 2 Runtime Environment, SE v1.4.2_07", _
"Java 2 Runtime Environment, SE v1.4.2_08", _
"Java 2 Runtime Environment, SE v1.4.2_12", _
"Java 2 Runtime Environment, SE v1.4.2_13", _
"Java 2 Runtime Environment, SE v1.4.2_15", _
"Java 2 Runtime Environment, SE v1.4.2_16", _
"Java 2 Runtime Environment, SE v1.4.2_19", _
"Java Auto Updater", _
"Java(TM) 6 Update 10", _
"Java(TM) 6 Update 11", _
"Java(TM) 6 Update 13", _
"Java(TM) 6 Update 17", _
"Java(TM) 6 Update 18", _
"Java(TM) 6 Update 2", _
"Java(TM) 6 Update 20", _
"Java(TM) 6 Update 21", _
"Java(TM) 6 Update 22", _
"Java(TM) 6 Update 23", _
"Java(TM) 6 Update 24", _
"Java(TM) 6 Update 26", _
"Java(TM) 6 Update 29", _
"Java(TM) 6 Update 29 (64-bit)", _
"Java(TM) 6 Update 3", _
"Java(TM) 6 Update 30", _
"Java(TM) 6 Update 31", _
"Java(TM) 6 Update 31 (64-bit)", _
"Java(TM) 6 Update 32", _
"Java(TM) 6 Update 32 (64-bit)", _
"Java(TM) 6 Update 5", _
"Java(TM) 6 Update 7", _
"Java(TM) 7 Update 3", _
"Java(TM) 7 Update 4", _
"Java(TM) 7 Update 4 (64-bit)"]


Local $sComputer = "."
Local $sSoftwareName
Local $oSWbemLocator    = ObjCreate("WbemScripting.SWbemLocator")
Local $oSWbemServicesEx = $oSWbemLocator.ConnectServer($sComputer, "root\cimv2")
Local $cSWbemObjectSet  = $oSWbemServicesEx.ExecQuery("SELECT * FROM Win32_Product")
Local $oSWbemObjectEx

For $oSWbemObjectEx In $cSWbemObjectSet
        For $sSoftwareName In $aSoftwareNames
                If $sSoftwareName = $oSWbemObjectEx.Name Then
                        $oSWbemObjectEx.Uninstall()
                EndIf
        Next
Next

$oSWbemObjectEx  = 0
$cSWbemObjectSet  = 0
$oSWbemServicesEx = 0
$oSWbemLocator    = 0

Exit(0)


Iska 11-07-2012 23:40 1950319

HFShak, Вы уверены, что приведённая ошибка воспроизводится именно приведённым кодом?

Попробуйте исполнить этот код на проблемной машине:
читать дальше »
Код:

AutoItSetOption("MustDeclareVars", 1)

Global $oAutoItError = ObjEvent("AutoIt.Error", "ErrorHandling")

Local $aSoftwareNames[40] = [ _
        "Java 2 Runtime Environment Standard Edition v1.2.2", _
        "Java 2 Runtime Environment Standard Edition v1.3.1_05", _
        "Java 2 Runtime Environment Standard Edition v1.3.1_17", _
        "Java 2 Runtime Environment, SE v1.4.2_01", _
        "Java 2 Runtime Environment, SE v1.4.2_03", _
        "Java 2 Runtime Environment, SE v1.4.2_05", _
        "Java 2 Runtime Environment, SE v1.4.2_06", _
        "Java 2 Runtime Environment, SE v1.4.2_07", _
        "Java 2 Runtime Environment, SE v1.4.2_08", _
        "Java 2 Runtime Environment, SE v1.4.2_12", _
        "Java 2 Runtime Environment, SE v1.4.2_13", _
        "Java 2 Runtime Environment, SE v1.4.2_15", _
        "Java 2 Runtime Environment, SE v1.4.2_16", _
        "Java 2 Runtime Environment, SE v1.4.2_19", _
        "Java Auto Updater", _
        "Java(TM) 6 Update 10", _
        "Java(TM) 6 Update 11", _
        "Java(TM) 6 Update 13", _
        "Java(TM) 6 Update 17", _
        "Java(TM) 6 Update 18", _
        "Java(TM) 6 Update 2", _
        "Java(TM) 6 Update 20", _
        "Java(TM) 6 Update 21", _
        "Java(TM) 6 Update 22", _
        "Java(TM) 6 Update 23", _
        "Java(TM) 6 Update 24", _
        "Java(TM) 6 Update 26", _
        "Java(TM) 6 Update 29", _
        "Java(TM) 6 Update 29 (64-bit)", _
        "Java(TM) 6 Update 3", _
        "Java(TM) 6 Update 30", _
        "Java(TM) 6 Update 31", _
        "Java(TM) 6 Update 31 (64-bit)", _
        "Java(TM) 6 Update 32", _
        "Java(TM) 6 Update 32 (64-bit)", _
        "Java(TM) 6 Update 5", _
        "Java(TM) 6 Update 7", _
        "Java(TM) 7 Update 3", _
        "Java(TM) 7 Update 4", _
        "Java(TM) 7 Update 4 (64-bit)" _
]
Local $sSoftwareName

Local $sComputer = "."

Local $oSWbemLocator    = ObjCreate("WbemScripting.SWbemLocator")
Local $oSWbemServicesEx = $oSWbemLocator.ConnectServer($sComputer, "root\cimv2")
Local $cSWbemObjectSet  = $oSWbemServicesEx.ExecQuery("SELECT * FROM Win32_Product")
Local $oSWbemObjectEx

For $oSWbemObjectEx In $cSWbemObjectSet
        For $sSoftwareName In $aSoftwareNames
                If $sSoftwareName = $oSWbemObjectEx.Name Then
                        $oSWbemObjectEx.Uninstall()
                EndIf
        Next
Next

$oSWbemObjectEx  = 0
$cSWbemObjectSet  = 0
$oSWbemServicesEx = 0
$oSWbemLocator    = 0

Exit(0)

Func ErrorHandling()
        Local $HexNumber = Hex($oAutoItError.Number, 8)

        MsgBox(0, "", "We intercepted a COM Error !" & @CRLF & _
                "Number is: " & $HexNumber & @CRLF & _
                "Windescription is: " & $oAutoItError.WinDescription & @CRLF & _
                "Name of the Object generating the error: " & $oAutoItError.Source & @CRLF & _
                "Source Object's description: " & $oAutoItError.Description & @CRLF & _
                "The number returned from GetLastError(): " & $oAutoItError.lastDllError & @CRLF & _
                "Script Line: " & $oAutoItError.ScriptLine _
        )

  Exit(-1)
EndFunc


в неизменном виде. При появлении сообщения об ошибке нажмите в окне сообщения об ошибке «Ctrl-C» и выложите содержимое буфера обмена сюда.
Возможный примерный вид полученного
Код:

---------------------------

---------------------------
We intercepted a COM Error !

Number is: 80020006

Windescription is: Неизвестное имя.



Name of the Object generating the error:

Source Object's description:

The number returned from GetLastError(): 0

Script Line: 58
---------------------------
ОК 
---------------------------


HFShak 12-07-2012 11:08 1950479

Добрый день!
Получился вот такой лог:

Код:

---------------------------

---------------------------
We intercepted a COM Error !

Number is: 80020009

Windescription is:

Name of the Object generating the error: SWbemObjectEx

Source Object's description: Not found

The number returned from GetLastError(): 0

Script Line: -1
---------------------------
ОК 
---------------------------


Iska 12-07-2012 11:35 1950498

Спасибо, не ясно ;).

Озвучьте ещё версию ОС, версию Windows Installer на машине, для которой исполняется скрипт.

HFShak 12-07-2012 11:55 1950513

Windows 7 SP1 64 bit
Установщик Windows®. Версия 5.0.7601.17514

HFShak 12-07-2012 15:49 1950670

Дописал первоначальный свой скрипт:

Код:

Local $strComputer = "."
Local $sSoftwareName
Local $aSoftwareNames[40] = [ _
"Java 2 Runtime Environment Standard Edition v1.2.2", _
"Java 2 Runtime Environment Standard Edition v1.3.1_05", _
"Java 2 Runtime Environment Standard Edition v1.3.1_17", _
"Java 2 Runtime Environment, SE v1.4.2_01", _
"Java 2 Runtime Environment, SE v1.4.2_03", _
"Java 2 Runtime Environment, SE v1.4.2_05", _
"Java 2 Runtime Environment, SE v1.4.2_06", _
"Java 2 Runtime Environment, SE v1.4.2_07", _
"Java 2 Runtime Environment, SE v1.4.2_08", _
"Java 2 Runtime Environment, SE v1.4.2_12", _
"Java 2 Runtime Environment, SE v1.4.2_13", _
"Java 2 Runtime Environment, SE v1.4.2_15", _
"Java 2 Runtime Environment, SE v1.4.2_16", _
"Java 2 Runtime Environment, SE v1.4.2_19", _
"Java Auto Updater", _
"Java(TM) 6 Update 10", _
"Java(TM) 6 Update 11", _
"Java(TM) 6 Update 13", _
"Java(TM) 6 Update 17", _
"Java(TM) 6 Update 18", _
"Java(TM) 6 Update 2", _
"Java(TM) 6 Update 20", _
"Java(TM) 6 Update 21", _
"Java(TM) 6 Update 22", _
"Java(TM) 6 Update 23", _
"Java(TM) 6 Update 24", _
"Java(TM) 6 Update 26", _
"Java(TM) 6 Update 29", _
"Java(TM) 6 Update 29 (64-bit)", _
"Java(TM) 6 Update 3", _
"Java(TM) 6 Update 30", _
"Java(TM) 6 Update 31", _
"Java(TM) 6 Update 31 (64-bit)", _
"Java(TM) 6 Update 32", _
"Java(TM) 6 Update 32 (64-bit)", _
"Java(TM) 6 Update 5", _
"Java(TM) 6 Update 7", _
"Java(TM) 7 Update 3", _
"Java(TM) 7 Update 4", _
"Java(TM) 7 Update 4 (64-bit)"]


$objWMIService = ObjGet("winmgmts:" & "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
For $sSoftwareName In $aSoftwareNames
  $colSoftware = $objWMIService.ExecQuery ("Select * from Win32_Product Where Name = '" & $sSoftwareName & "'")
          For $objSoftware In $colSoftware
                $objSoftware.Uninstall()
          Next
Next
Exit(0)

Отрабатывает без ошибки, но работает дольше...
Надеюсь, я не нарушил логику))
Возможно причина ошибки из-за класса oSWbemObjectEx.Name, т.к. только в нем отличия...
Тестировал на одной и той же виртуалке.

Iska 13-07-2012 09:11 1951035

HFShak, а ежели WSH попробовать:
читать дальше »
Код:

Option Explicit

Dim arrSoftwareNames
Dim strSoftwareName

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx


arrSoftwareNames = Array( _
        "Java 2 Runtime Environment Standard Edition v1.2.2", _
        "Java 2 Runtime Environment Standard Edition v1.3.1_05", _
        "Java 2 Runtime Environment Standard Edition v1.3.1_17", _
        "Java 2 Runtime Environment, SE v1.4.2_01", _
        "Java 2 Runtime Environment, SE v1.4.2_03", _
        "Java 2 Runtime Environment, SE v1.4.2_05", _
        "Java 2 Runtime Environment, SE v1.4.2_06", _
        "Java 2 Runtime Environment, SE v1.4.2_07", _
        "Java 2 Runtime Environment, SE v1.4.2_08", _
        "Java 2 Runtime Environment, SE v1.4.2_12", _
        "Java 2 Runtime Environment, SE v1.4.2_13", _
        "Java 2 Runtime Environment, SE v1.4.2_15", _
        "Java 2 Runtime Environment, SE v1.4.2_16", _
        "Java 2 Runtime Environment, SE v1.4.2_19", _
        "Java Auto Updater", _
        "Java(TM) 6 Update 10", _
        "Java(TM) 6 Update 11", _
        "Java(TM) 6 Update 13", _
        "Java(TM) 6 Update 17", _
        "Java(TM) 6 Update 18", _
        "Java(TM) 6 Update 2", _
        "Java(TM) 6 Update 20", _
        "Java(TM) 6 Update 21", _
        "Java(TM) 6 Update 22", _
        "Java(TM) 6 Update 23", _
        "Java(TM) 6 Update 24", _
        "Java(TM) 6 Update 26", _
        "Java(TM) 6 Update 29", _
        "Java(TM) 6 Update 29 (64-bit)", _
        "Java(TM) 6 Update 3", _
        "Java(TM) 6 Update 30", _
        "Java(TM) 6 Update 31", _
        "Java(TM) 6 Update 31 (64-bit)", _
        "Java(TM) 6 Update 32", _
        "Java(TM) 6 Update 32 (64-bit)", _
        "Java(TM) 6 Update 5", _
        "Java(TM) 6 Update 7", _
        "Java(TM) 7 Update 3", _
        "Java(TM) 7 Update 4", _
        "Java(TM) 7 Update 4 (64-bit)" _
)

strComputer = "."

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_Product")

For Each objSWbemObjectEx In collSWbemObjectSet
        WScript.Echo "[" & objSWbemObjectEx.Name & "]"
       
        For Each strSoftwareName In arrSoftwareNames
                If strSoftwareName = objSWbemObjectEx.Name Then
                        objSWbemObjectEx.Uninstall()
                End If
        Next
Next

Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

WScript.Quit 0


что получится (выполняйте из-под командной строки посредством «cscript.exe»)?


Время: 01:21.

Время: 01:21.
© OSzone.net 2001-