[решено] Задать массив и цикл

Ответить
Аватара пользователя
HFShak

[решено] Задать массив и цикл

Сообщение HFShak »

Добрый день!

Есть такой скрипт:



Код:

Код: Выделить всё

$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

Re: [решено] Задать массив и цикл

Сообщение Iska »

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



Код:

Код: Выделить всё

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

Re: [решено] Задать массив и цикл

Сообщение HFShak »

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

Изображение

"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

Re: [решено] Задать массив и цикл

Сообщение Iska »

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





в неизменном[/i] виде. При появлении сообщения об ошибке нажмите в окне сообщения об ошибке «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

Re: [решено] Задать массив и цикл

Сообщение HFShak »

Добрый день!

Получился вот такой лог:





Код:

Код: Выделить всё

---------------------------
---------------------------
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

Re: [решено] Задать массив и цикл

Сообщение Iska »

Спасибо, не ясно Изображение.



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

Re: [решено] Задать массив и цикл

Сообщение Iska »

Windows 7 SP1 64 bit

Установщик Windows®. Версия 5.0.7601.17514
Аватара пользователя
HFShak

Re: [решено] Задать массив и цикл

Сообщение HFShak »

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





Код:

Код: Выделить всё

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

Re: [решено] Задать массив и цикл

Сообщение Iska »

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»)?
Ответить

Вернуться в «AutoIt»