bourny Posted December 21, 2011 Share Posted December 21, 2011 I am running a script to query WMI to pull out if a system is 32 bit or not. This works fine but is tripped up when it cannot pull a value and errors out. The error I get in SciTE is: $Type = $objOperatingSystem.OSArchitecture $Type = $objOperatingSystem.OSArchitecture^ ERROR The issue is I am not handling correctly if $objWMIService = ObjGet if an object has not been returned. I have tried if not isobj( $objWMIService) but this does not work . My script is as follows: $type = "" $wbemFlagReturnImmediately = 0x10 $wbemFlagForwardOnly = 0x20 $colItems = "" $strComputer = "localhost" $Output="" $Output = $Output & "Computer: " & $strComputer & @CRLF $Output = $Output & "==========================================" & @CRLF $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2") $colItems = $objWMIService.ExecQuery("Select * from Win32_OperatingSystem", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly) For $objOperatingSystem in $colItems $Type = $objOperatingSystem.OSArchitecture ;Msgbox(0,"",$objOperatingSystem) Next Msgbox(0,"",$type) Any help appreciated. Link to comment Share on other sites More sharing options...
water Posted December 21, 2011 Share Posted December 21, 2011 You need a COM error handler. Please see function ObjEvent in the help file for an example.; COM Error Handler example ; ------------------------- $oMyError = ObjEvent("AutoIt.Error","MyErrFunc") ; Initialize a COM error handler ; ... Your code goes here Exit ; This is my custom defined error handler Func MyErrFunc() Msgbox(0,"AutoItCOM Test","We intercepted a COM Error !" & @CRLF & @CRLF & _ "err.description is: " & @TAB & $oMyError.description & @CRLF & _ "err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _ "err.number is: " & @TAB & hex($oMyError.number,8) & @CRLF & _ "err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _ "err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _ "err.source is: " & @TAB & $oMyError.source & @CRLF & _ "err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _ "err.helpcontext is: " & @TAB & $oMyError.helpcontext _ ) Endfunc My UDFs and Tutorials: Spoiler UDFs:Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - WikiExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example ScriptsOutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - WikiOutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - DownloadOutlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - WikiPowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - WikiTask Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs:Excel - Example Scripts - WikiWord - Wiki Tutorials:ADO - WikiWebDriver - Wiki Link to comment Share on other sites More sharing options...
bourny Posted December 21, 2011 Author Share Posted December 21, 2011 Thanks, Got that working now. I have done the script below to overcome this issue. I am assuming from this the OBJEvent is like an adlib that is constantly running and only deals with objget errors and nothing else. Why do you need to use "If not ISobj($value) if you have the OBJEvent handler. I am not that advanced in scripting with objects hence my lack of understanding. My new code : $oMyError = ObjEvent("AutoIt.Error","MyErrFunc") ; Initialize a COM error handler $type = "" $wbemFlagReturnImmediately = 0x10 $wbemFlagForwardOnly = 0x20 $colItems = "" $strComputer = "localhost" $Output="" $Output = $Output & "Computer: " & $strComputer & @CRLF $Output = $Output & "==========================================" & @CRLF $objWMIService = ObjGet("winmgmts:" & $strComputer & "rootCIMV2") $colItems = $objWMIService.ExecQuery("Select * from Win32_OperatingSystem", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly) For $objOperatingSystem in $colItems $Type = $objOperatingSystem.OSArchitecture ;Msgbox(0,"",$objOperatingSystem) Next If $Type = "" Then Msgbox(0,"Nothing found", "") Else Msgbox(0,"Found this value", $Type) EndIf Func MyErrFunc() Endfunc Link to comment Share on other sites More sharing options...
Moderators JLogan3o13 Posted December 21, 2011 Moderators Share Posted December 21, 2011 (edited) Hi, bourny. Is this part of a larger script? If, as it appears from your original post, you're only trying to find the architecture, using @OSArch would be a lot simpler.MsgBox(0, "", @OSArch) Edited December 21, 2011 by JLogan3o13 "Profanity is the last vestige of the feeble mind. For the man who cannot express himself forcibly through intellect must do so through shock and awe" - Spencer W. Kimball How to get your question answered on this forum! Link to comment Share on other sites More sharing options...
bourny Posted December 21, 2011 Author Share Posted December 21, 2011 Yes it is and it would be easier to do this but I am forcing a trainee to use WMI to extract information on various areas of the system. This brought up the issue of systems not having this information available on the WMI class so it needed to handle this correctly instead of falling over with autoit errors. As you have correctly stated this needs a com error handler set. Can I still request an answer to my follow on question please.: q. I am assuming from this the OBJEvent is like an adlib that is constantly running and only deals with objget errors and nothing else. Link to comment Share on other sites More sharing options...
water Posted December 21, 2011 Share Posted December 21, 2011 I am assuming from this the OBJEvent is like an adlib that is constantly running and only deals with objget errors and nothing else.AdlLib is called every x milliseconds (you specify x with AdlibRegister) and then runs the function you specified.The COM error handler you defined with ObjEvent is only called when an error occurres. The COM error handler not only handles ObjGet errors but ALL COM related errors. That means: If you call a method that doesn't exist, pass the wrong number of parameters or of the wrong type, try to access none existing properties of an object etc. etc.Why do you need to use "If not ISobj($value) if you have the OBJEvent handler.Just in case a method returns an object when everything is fine and 0 or whatever when there was an error. In most cases the COM error handler is enough. My UDFs and Tutorials: Spoiler UDFs:Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - WikiExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example ScriptsOutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - WikiOutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - DownloadOutlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - WikiPowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - WikiTask Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs:Excel - Example Scripts - WikiWord - Wiki Tutorials:ADO - WikiWebDriver - Wiki Link to comment Share on other sites More sharing options...
bourny Posted December 22, 2011 Author Share Posted December 22, 2011 Water: Thanks for your reply.Since using the "$oMyError = ObjEvent("AutoIt.Error","MyErrFunc")" function this has fixed most issues apart from one machine. I have an XP machine out of a list of 10 machines that keeps chucking up a different error only when the OBJEvent handler is used. The ScIte error I get is as follows>Running:(3.3.6.1):C:Program FilesAutoIt3autoit3.exe "C:Program FilesAutoIt3TEST1.au3" C:Program FilesAutoIt3TEST1.au3 (18) : ==> Missing right bracket ')' in expression.:$colItems = $objWMIService.ExecQuery("Select * from Win32_ComputerSystem", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)$colItems = ^ ERROR->10:05:13 AutoIT3.exe ended.rc:1>Exit code: 1 Time: 22.782If I then add an "If not isOBJ after the "$objWMIService = ObjGet("winmgmts:" & $strComputer & "rootCIMV2")" This then fixes that issue. This tells me I need to not only use the "if not isobj" but also the "$oMyError = ObjEvent("AutoIt.Error","MyErrFunc")",My question is to understand the differences. Why does above quotes error with bracket occur if the "If not isobj" present. I thought the OBJevent woulkd handle all errors. Can you explain the difference to allow me to understand. Link to comment Share on other sites More sharing options...
water Posted December 22, 2011 Share Posted December 22, 2011 You are getting a syntax error. Press Ctrl + F5 in SciTe and you should get this error. If you use the same code on all machines you should get this error on every machine. My UDFs and Tutorials: Spoiler UDFs:Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - WikiExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example ScriptsOutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - WikiOutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - DownloadOutlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - WikiPowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - WikiTask Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs:Excel - Example Scripts - WikiWord - Wiki Tutorials:ADO - WikiWebDriver - Wiki Link to comment Share on other sites More sharing options...
UEZ Posted December 22, 2011 Share Posted December 22, 2011 Try this: Global $oErrorHandler = ObjEvent("AutoIt.Error", "ObjErrorHandler") $type = "" $wbemFlagReturnImmediately = 0x10 $wbemFlagForwardOnly = 0x20 $colItems = "" $strComputer = "localhost" $Output="" $Output = $Output & "Computer: " & $strComputer & @CRLF $Output = $Output & "==========================================" & @CRLF $objWMIService = ObjGet("winmgmts:" & $strComputer & "rootCIMV2") If @error Then Exit MsgBox(16, "Error", "Error") $colItems = $objWMIService.ExecQuery("Select * from Win32_OperatingSystem", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly) If IsObj($colItems) Then For $objOperatingSystem in $colItems $Type = $objOperatingSystem.OSArchitecture ;Msgbox(0,"",$objOperatingSystem) Next Msgbox(0,"",$type) Else MsgBox(16, "Error", "Error") EndIf Func ObjErrorHandler() ConsoleWrite( "A COM Error has occured!" & @CRLF & @CRLF & _ "err.description is: " & @TAB & $oErrorHandler.description & @CRLF & _ "err.windescription:" & @TAB & $oErrorHandler & @CRLF & _ "err.number is: " & @TAB & Hex($oErrorHandler.number, 8) & @CRLF & _ "err.lastdllerror is: " & @TAB & $oErrorHandler.lastdllerror & @CRLF & _ "err.scriptline is: " & @TAB & $oErrorHandler.scriptline & @CRLF & _ "err.source is: " & @TAB & $oErrorHandler.source & @CRLF & _ "err.helpfile is: " & @TAB & $oErrorHandler.helpfile & @CRLF & _ "err.helpcontext is: " & @TAB & $oErrorHandler.helpcontext & @CRLF _ ) EndFunc Br, UEZ Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now