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

Reply via email to