use Win32::OLE('in'); use constant wbemFlagReturnImmediately => 0x10; use constant wbemFlagForwardOnly => 0x20; sub Logical_Disks { my $computer=shift; my %HoH = (); my $objWMIService = Win32::OLE->GetObject("winmgmts:\\\\$computer\\root\\CIMV2") or die "WMI connection failed.\n"; my $colItems = $objWMIService->ExecQuery("SELECT * FROM Win32_LogicalDisk", "WQL", wbemFlagReturnImmediately | wbemFlagForwardOnly)||warn $!; foreach my $objItem (in $colItems) { my @drivetype= ('Unknown', 'No RootDirectory', 'RemovableDisk', 'LocalDisk', 'Network Drive', 'Compact Disc', 'RAM Disk'); #next if $objItem->{Name}->{'DriveType'} ne 'LocalDisk';#skip non logical disks $HoH{ $objItem->{Name} }{ 'DriveType' } =$drivetype[$objItem->{DriveType}] ; $HoH{ $objItem->{Name} }{ 'VolumeName' } = $objItem->{VolumeName}; $HoH{ $objItem->{Name} }{ 'Size' } = $objItem->{Size}; $HoH{ $objItem->{Name} }{ 'FreeSpace' } = $objItem->{FreeSpace}; } foreach my $key(keys %HoH){delete $HoH{$key} unless $HoH{$key}->{'DriveType'} eq 'LocalDisk'} return \%HoH; }