PDA

Показать полную графическую версию : [решено] Задать массив и цикл


HFShak
11-07-2012, 10:05
Добрый день!
Есть такой скрипт:

$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
Например, так (не проверялось):
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
Ага, работает, спасибо.

HFShak
11-07-2012, 14:51
Не знаете, почему может возникать данная проблема?
http://s004.radikal.ru/i207/1207/45/5c49d0b275ba.jpg
"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
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
Добрый день!
Получился вот такой лог:

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

---------------------------
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
Спасибо, не ясно ;).

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

HFShak
12-07-2012, 11:55
Windows 7 SP1 64 bit
Установщик Windows®. Версия 5.0.7601.17514

HFShak
12-07-2012, 15:49
Дописал первоначальный свой скрипт:

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
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»)?




© OSzone.net 2001-2012