Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

WMI and Perl

by softworkz (Monk)
on Jan 25, 2005 at 15:31 UTC ( [id://424895]=perlquestion: print w/replies, xml ) Need Help??

softworkz has asked for the wisdom of the Perl Monks concerning the following question:

Fello Monks, I've started using Perl and wmi and I'm stumped on a little quirk... IF I run the script as it is I will get an unintialized value, so I'm wondering what this hash value is? Thanks for any help!
#!/usr/bin/perl -w use strict; use Win32::OLE('in'); use constant wbemFlagReturnImmediately => 0x10; use constant wbemFlagForwardOnly => 0x20; my @computers = ("MYCOMPUTER"); foreach my $computer (@computers) { my $objWMIService = Win32::OLE->GetObject("winmgmts:\\\\$computer\\ +root\\CIMV2") or die "WMI connection failed.\n"; my $colItems = $objWMIService->ExecQuery("SELECT * FROM Win32_Volum +e", "WQL", wbemFlagReturnImmediately | wbemFlagForwardOnly); foreach my $objItem (in $colItems) { #next unless ($objItem->{FreeSpace}); # print "$objItem\n"; print "Free Space on $computer: $objItem->{FreeSpace}\n"; } }

Replies are listed 'Best First'.
Re: WMI and Perl
by NetWallah (Canon) on Jan 25, 2005 at 17:17 UTC
    Here is some working code, based on yours Plus this msdn article.
    #!/usr/bin/perl -w use strict; use Win32::OLE('in'); use Data::Dumper; use constant wbemFlagReturnImmediately => 0x10; use constant wbemFlagForwardOnly => 0x20; my @computers = qw( WWMONITOR3 ); foreach my $computer (@computers) { my $objWMIService = Win32::OLE->GetObject("winmgmts:\\\\$computer\\ +root\\CIMV2") or die "WMI connection failed.\n"; my $colItems = $objWMIService->ExecQuery( "select FreeSpace,Size,Name from Win32_LogicalDisk w +here DriveType=3", "WQL", wbemFlagReturnImmediately | wbemFlagForwardOnly); foreach my $Disk( in $colItems){ print "$computer : Drive $Disk->{Name} has " . format_kilo($Disk->{FreeSpace}) . " free (" . format_kilo($Disk->{Size}) . " total)\n"; } } ############################################################### sub format_kilo # Kilo, mega and gig { my $number = shift; my $fixwidth = shift; my $suffix = " "; if ($number > 0x40000000) { $number /= 0x40000000; $suffix = 'G'; } elsif ($number > 0x100000) { $number /= 0x100000; $suffix = 'M'; } elsif ($number > 0x400) { $number /= 0x400; $suffix = 'K'; } # Split integer and decimal parts of the number and add commas my $integer = int($number); # Add Leading spaces if fixed width $fixwidth and $integer = ' ' x ($fixwidth - length($integer) - le +ngth($suffix)) . $integer; # Combine it all back together and return it. return $integer.$suffix; }
    UPDATE:
    Your code would work if you checked the value of $objItem->{DriveType} , and printed only when that had a value of "3" (Logical Disk). Most likely, your last disk has a value of "5" (CD ROM), which does not return valid FreeSpace or other attributes, uless it has a CD mounted.

    Hence, if you want to look at VOLUMES, make sure you are not looking at mapped drives, CD's etc - and limit your examination to {DriveType} == 3.

        ..."I don't know what the facts are but somebody's certainly going to sit down with him and find out what he knows that they may not know, and make sure he knows what they know that he may not know, and that's a good thing. I think it's a very constructive exchange," --Donald Rumsfeld

      ++ for everyones help, it seems to be the cd rom. Thanks for the samples.
      to my code I added this"SELECT * FROM Win32_Volume where DriveLetter = 'c:\'
Re: WMI and Perl
by Solo (Deacon) on Jan 25, 2005 at 16:07 UTC
    According to the MSDN Library doc, the Win32_Volume class is not available on XP or prior windows versions. Could that be your problem?

    Here's code I typically use... (that I haven't used since 2K and could be flaky on XP)

    my $class = "Win32_LogicalDisk"; my $Info = $SWbemServices->InstancesOf( $class ) || die "Could not access instances of $class on $hostname"; for my $Item (in ($Info) ) { if ( $Item->{DriveType} == 3 ) { my $size = int( $Item->{Size} / (1024 * 1024 * 1024) ); my $free = int( $Item->{FreeSpace} / (1024 * 1024 * 1024) ); print $Item->{Name} . " $size GB\n"; } }

    --Solo

    --
    You said you wanted to be around when I made a mistake; well, this could be it, sweetheart.
      Thanks Solo, yea I'm aware of that, this script runs on windoze 2003 enterprise. Thanks
Re: WMI and Perl
by mpeters (Chaplain) on Jan 25, 2005 at 17:13 UTC
    Try using Data::Dumper on the objects you get to see what's inside of them.
    use Data::Dumper; foreach my $objItem (in $colItems) { print Dumper($objItem); #next unless ($objItem->{FreeSpace}); # print "$objItem\n"; print "Free Space on $computer: $objItem->{FreeSpace}\n"; }

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://424895]
Approved by sweetblood
Front-paged by broquaint
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others exploiting the Monastery: (7)
As of 2024-03-28 23:44 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found