On Sat, 05 Dec 2009 05:58:48 -0800, Michael Ellery
<[email protected]> wrote:
> Michael wrote:
>> On Fri, 04 Dec 2009 17:10:26 -0800, Michael Ellery
>> <[email protected]> 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
>> [email protected]
>> 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
[email protected]
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs