#!/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
| [reply] [Watch: Dir/Any] [d/l] |
++ 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:\'
| [reply] [Watch: Dir/Any] |
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.
| [reply] [Watch: Dir/Any] [d/l] |
Thanks Solo, yea I'm aware of that, this script runs on windoze 2003 enterprise. Thanks
| [reply] [Watch: Dir/Any] |
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";
}
| [reply] [Watch: Dir/Any] [d/l] |