On Sat, 05 Dec 2009 05:58:48 -0800, Michael Ellery <mi...@s2technologies.com> wrote: > Michael wrote: >> On Fri, 04 Dec 2009 17:10:26 -0800, Michael Ellery >> <mi...@s2technologies.com> wrote: >>> Michael wrote: >>>> Okay - Just to sum up the whole thing. >>>> >>>> The original VBScript <<EOF; >>>> >>>> Option Explicit >>>> >>>> Dim objWMIService, objOV_NodeGroup, objGetRoot, objChildGroups, >> arrNodes, >>>> objItem >>>> >>>> Set objWMIService = >>>> GetObject("winmgmts:root\HewlettPackard\OpenView\data") >>>> >>>> Set objOV_NodeGroup = objWMIService.Get("OV_NodeGroup") >>>> Set objGetRoot = objOV_NodeGroup.GetRoot() >>>> objChildGroups = objGetRoot.GetChildNodeGroups(arrNodes, True) >>>> >>>> WScript.Echo "Child Group Count: " & objChildGroups & vbCrLF >>>> >>>> For Each objItem In arrNodes >>>> WScript.Echo "Name: " & objItem.Name >>>> Next >>>> EOF >>>> >>>> Returns the following: >>>> >>>> Child Group Count: 25 >>>> >>>> Name: {36716FD8-E600-46FB-90CA-1263E0C62509} >>>> Name: {38FF8E8E-2DDC-4895-A7EB-0DC7DF50EC25} >>>> Name: {3E575181-0225-4553-9722-46F841B9FA76} >>>> Name: {8A412133-F571-42BC-8A66-4B242EB3BAC4} >>>> Name: {E14D965C-1FBB-40EC-A784-5F9F39F82281} >>>> Name: OpenView_AIX >>>> Name: OpenView_External >>>> Name: OpenView_HPUX >>>> Name: OpenView_Linux >>>> Name: OpenView_NNM >>>> Name: OpenView_OpenVMS >>>> Name: OpenView_OpenVMS(itanium) >>>> Name: OpenView_SNMP >>>> Name: OpenView_Solaris >>>> Name: OpenView_Tru64 >>>> Name: OpenView_Unknown >>>> Name: OpenView_Windows2000 >>>> Name: OpenView_WindowsNT >>>> Name: OpenView_WindowsServer2003 >>>> Name: OpenView_WindowsServer2008 >>>> Name: OpenView_WindowsVista >>>> Name: OpenView_WindowsXP >>>> Name: Root_Special >>>> Name: Root_Unix >>>> Name: Root_Windows >>>> >>>> And the Perl-Script with the modification <<EOF; >>>> #!perl >>>> use strict; >>>> use warnings; >>>> use Win32::OLE qw(in with); >>>> use Win32::OLE::Variant; >>>> use Data::Dumper; >>>> >>>> my $objWMIService = >>>> Win32::OLE->GetObject("winmgmts:root/HewlettPackard/OpenView/data") or >>>> die >>>> "WMI connection failed.\n"; >>>> if (Win32::OLE-> LastError() != 0) { >>>> print "Error calling GetObject: " . Win32::OLE->LastError() . "\n"; >>>> exit 0; >>>> } >>>> >>>> my $objOV_NodeGroup = $objWMIService->Get("OV_NodeGroup"); >>>> if (Win32::OLE-> LastError() != 0) { >>>> print "Error calling Get: " . Win32::OLE->LastError() . "\n"; >>>> exit 0; >>>> } >>>> >>>> my $objGetRoot = $objOV_NodeGroup->GetRoot(); >>>> if (Win32::OLE-> LastError() != 0) { >>>> print "Error calling GetRoot: " . Win32::OLE->LastError() . "\n"; >>>> exit 0; >>>> } >>>> >>>> my $nodes = Win32::OLE::Variant->new(VT_ARRAY|VT_VARIANT, 0); >>>> #my $nodes = Win32::OLE::Variant->new(VT_VARIANT|VT_BYREF); >>>> #my $nodes = Win32::OLE::Variant->new(VT_ARRAY|VT_BSTR, 0); >>>> #my $nodes = Win32::OLE::Variant->new(VT_DISPATCH|VT_BYREF); >>>> #my $nodes = Win32::OLE::Variant->new(VT_ARRAY|VT_VARIANT|VT_BYREF, 0); >>>> #my $nodes = Win32::OLE::Variant->new(VT_ARRAY|VT_BSTR|VT_BYREF, 0); >>>> #my $nodes = Win32::OLE::Variant->new(VT_VARIANT|VT_BYREF); >>>> #my $nodes = Win32::OLE::Variant->new(VT_ARRAY|VT_VARIANT|VT_BYREF, 0); >>>> >>>> my $objChildGroups = $objGetRoot->GetChildNodeGroups($nodes, "True"); >>>> if (Win32::OLE-> LastError() != 0) { >>>> print "Error calling GetChildNodeGroups: " . Win32::OLE->LastError() . >>>> "\n"; >>>> exit 0; >>>> } >>>> print "Child Group Count: " . $objChildGroups . "\n"; >>>> >>>> print Dumper($nodes); >>>> >>>> >>>> foreach my $objItem (in $nodes) { >>>> print 'Name: ' . $objItem->{Name} . "\n"; >>>> } >>>> >>>> #my $nodes = Win32::OLE::Variant->new(VT_ARRAY|VT_VARIANT, 0); Returns >>>> ##Child Group Count: 25 >>>> ##$VAR1 = bless( do{\(my $o = 27197068)}, 'Win32::OLE::Variant' ); >>>> ##Not a HASH reference at GetChildNodeGroups.pl line 46. >>>> >>>> #my $nodes = Win32::OLE::Variant->new(VT_VARIANT|VT_BYREF); Returns >>>> ##Child Group Count: 25 >>>> ##$VAR1 = bless( do{\(my $o = 27197828)}, 'Win32::OLE::Variant' ); >>>> ##Not a HASH reference at GetChildNodeGroups.pl line 46. >>>> >>>> #my $nodes = Win32::OLE::Variant->new(VT_ARRAY|VT_BSTR, 0); Returns >>>> ##Child Group Count: 25 >>>> ##$VAR1 = bless( do{\(my $o = 27198308)}, 'Win32::OLE::Variant' ); >>>> ##Not a HASH reference at GetChildNodeGroups.pl line 46. >>>> >>>> #my $nodes = Win32::OLE::Variant->new(VT_DISPATCH|VT_BYREF); Returns >>>> ##Error calling GetChildNodeGroups: Win32::OLE(0.1709) error >>>> 0x80010105: >>>> "The server threw an exception" >>>> ## in METHOD/PROPERTYGET "GetChildNodeGroups" >>>> >>>> #my $nodes = Win32::OLE::Variant->new(VT_ARRAY|VT_VARIANT|VT_BYREF, 0); >>>> Returns >>>> ##Child Group Count: 25 >>>> ##$VAR1 = bless( do{\(my $o = 27199076)}, 'Win32::OLE::Variant' ); >>>> ##Not a HASH reference at GetChildNodeGroups.pl line 46. >>>> >>>> #my $nodes = Win32::OLE::Variant->new(VT_ARRAY|VT_BSTR|VT_BYREF, 0); >>>> Returns >>>> ##Child Group Count: 25 >>>> ##$VAR1 = bless( do{\(my $o = 27197684)}, 'Win32::OLE::Variant' ); >>>> ##Not a HASH reference at GetChildNodeGroups.pl line 46. >>>> >>>> #my $nodes = Win32::OLE::Variant->new(VT_VARIANT|VT_BYREF); Returns >>>> ##Child Group Count: 25 >>>> ##$VAR1 = bless( do{\(my $o = 27199620)}, 'Win32::OLE::Variant' ); >>>> ##Not a HASH reference at GetChildNodeGroups.pl line 46. >>>> >>>> #my $nodes = Win32::OLE::Variant->new(VT_ARRAY|VT_VARIANT|VT_BYREF, 0); >>>> Returns >>>> ##Child Group Count: 25 >>>> ##$VAR1 = bless( do{\(my $o = 27199524)}, 'Win32::OLE::Variant' ); >>>> ##Not a HASH reference at GetChildNodeGroups.pl line 46. >>>> >>>> Does any of this, make any sense to you guys? >>>> >>>> /Michael >>>> >>> >>> so, it looks like your Dumper statement is indicating a valid object in >>> most cases. I think the problem on your loop is that you are using the >>> 'in' adapter, which requires the object to be IEnumerable. A variant >>> array is not enumerable (I believe) - so just try treating it like an >>> array, maybe something like this >>> >>> foreach my $objItem (@$nodes) { >>> print 'Name: ' . $objItem->{Name} . "\n"; >>> } >>> >>> >>> -Mike >> >> Well it just changes the error to: >> >> Child Group Count: 25 >> $VAR1 = bless( do{\(my $o = 27200092)}, 'Win32::OLE::Variant' ); >> Not an ARRAY reference at GetChildNodeGroups.pl line 46. >> >> Damn this is complicated :-S >> >> /Michael >> _______________________________________________ >> Perl-Win32-Users mailing list >> Perl-Win32-Users@listserv.ActiveState.com >> To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs >> > > okay - two more possibilities: > > foreach my $objItem ($nodes->Value()) { > print 'Name: ' . $objItem->{Name} . "\n"; > } > > OR (not sure if Value returns an arrayref or an array...) > > foreach my $objItem (@{$nodes->Value()}) { > print 'Name: ' . $objItem->{Name} . "\n"; > } > > or, perhaps even: > > for (my $i = 0; $i != $objChildGroups; $i++) { > print 'Name: ' . $nodes->Get($i)->{Name} . "\n"; > } > > (I'm just going based on Win32::OLE::Variant docs). HTH. > > -Mike
Mike! That did it :-D So setting the Variant to either: my $nodes = Win32::OLE::Variant->new(VT_VARIANT|VT_BYREF); or my $nodes = Win32::OLE::Variant->new(VT_ARRAY|VT_VARIANT|VT_BYREF, 0); and then use the foreach or for loop foreach my $objItem (@{$nodes->Value()}) { print 'Name: ' . $objItem->{Name} . "\n"; } for (my $i = 0; $i != $objChildGroups; $i++) { print 'Name: ' . $nodes->Get($i)->{Name} . "\n"; } Returns the expected data. I must admit that I don't quite get it at the moment, but hopefully some more lines of Perl will help :-) Could you point me to a book or online resources about Variants, Win32::OLE for dummies? Again thanks for your input - and thanks to Steven M as well. Below is the final script, if someone needs it for future reference. /Michael # Final Script Begin #!perl use strict; use warnings; use Win32::OLE qw(in with); use Win32::OLE::Variant; use Data::Dumper; my $objWMIService = Win32::OLE->GetObject("winmgmts:root/HewlettPackard/OpenView/data") or die "WMI connection failed.\n"; if (Win32::OLE-> LastError() != 0) { print "Error calling GetObject: " . Win32::OLE->LastError() . "\n"; exit 0; } my $objOV_NodeGroup = $objWMIService->Get("OV_NodeGroup"); if (Win32::OLE-> LastError() != 0) { print "Error calling Get: " . Win32::OLE->LastError() . "\n"; exit 0; } my $objGetRoot = $objOV_NodeGroup->GetRoot(); if (Win32::OLE-> LastError() != 0) { print "Error calling GetRoot: " . Win32::OLE->LastError() . "\n"; exit 0; } # Use one of the following Variants my $nodes = Win32::OLE::Variant->new(VT_VARIANT|VT_BYREF); #my $nodes = Win32::OLE::Variant->new(VT_ARRAY|VT_VARIANT|VT_BYREF, 0); my $objChildGroups = $objGetRoot->GetChildNodeGroups($nodes, "True"); if (Win32::OLE-> LastError() != 0) { print "Error calling GetChildNodeGroups: " . Win32::OLE->LastError() . "\n"; exit 0; } print "Child Group Count: " . $objChildGroups . "\n\n"; # Use the foreach or for loop foreach my $objItem (@{$nodes->Value()}) { print 'Name: ' . $objItem->{Name} . "\n"; } #for (my $i = 0; $i != $objChildGroups; $i++) { # print 'Name: ' . $nodes->Get($i)->{Name} . "\n"; #} # Final Script End _______________________________________________ Perl-Win32-Users mailing list Perl-Win32-Users@listserv.ActiveState.com To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs