comebui
asked on
Powershell: New-Object add-member for multiple attributes shows no value
Hello Experts,
I have the following Function in powershell to get complete disk information.
The Issue I am facing is when I have only one Hard drive and one partition , the script execute successfully with valid return.
However When a Server is having more than one physical disk or more than one partition it is returning no value for $dskobj properties. Well I understand why it is doing it , because it doesn't know how to present it. However I can't think of any way to present this data.
I have the following Function in powershell to get complete disk information.
function get-diskinfo {
param($servername)
if (($servername -eq "localhost") -or ($servername -eq $hostname)) {
$ldiskobj = Get-WmiObject Win32_logicaldisk -computername $servername |
Where-Object {$_.DriveType -eq "3"} |
Select-Object @{Name="ServerName";Expression={"{0:N1}" -f($_.__SERVER)}},
@{Name="Drive";Expression={"{0:N1}" -f($_.DeviceID)}},
@{Name="Size";Expression={"{0:N1}" -f($_.Size/1gb)}},
@{Name="Freespace";Expression={"{0:N1}" -f($_.FreeSpace/1gb)}}
$phdskobj = Get-WmiObject Win32_DiskDrive -computername $servername |
Select-Object Model,
Bytespersector,
InterfaceType,
Manufacturer,
Status,
TotalHeads,
TotalCylinders
}
else {
$ldiskobj = Get-WmiObject Win32_logicaldisk -computername $servername -Credential $logincred |
Where-Object {$_.DriveType -eq "3"} |
Select-Object @{Name="ServerName";Expression={"{0:N1}" -f($_.__SERVER)}},
@{Name="Drive";Expression={"{0:N1}" -f($_.DeviceID)}},
@{Name="Size";Expression={"{0:N1}" -f($_.Size/1gb)}},
@{Name="Freespace";Expression={"{0:N1}" -f($_.FreeSpace/1gb)}}
$phdskobj = Get-WmiObject Win32_DiskDrive -computername $servername -Credential $logincred |
Select-Object Model,
Bytespersector,
InterfaceType,
Manufacturer,
Status,
TotalHeads,
TotalCylinders
}
$dskobj = New-Object psobject
$dskobj | Add-Member NoteProperty "Model" -Value $phdskobj.Model
$dskobj | Add-Member NoteProperty "Status" -Value $phdskobj.status
$dskobj | Add-Member NoteProperty "Drive" -Value $ldiskobj .Drive
$dskobj | Add-Member NoteProperty "Freespace" -Value $ldiskobj .Freespace
cls
$dskobj |fl
}
The Issue I am facing is when I have only one Hard drive and one partition , the script execute successfully with valid return.
However When a Server is having more than one physical disk or more than one partition it is returning no value for $dskobj properties. Well I understand why it is doing it , because it doesn't know how to present it. However I can't think of any way to present this data.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
% is a bad habit :) I forgot to replace that with the actual cmdlet when copying it over.
It is a shortcut for the ForEach-Object cmdlet. For example, these will do the same thing.
The reason you don't need to do this to find the model and deviceID, is that there is only 1 reference to each physical device so for each drive in the target host you can assume the model and status will be the same for each partition on that drive.
It is a shortcut for the ForEach-Object cmdlet. For example, these will do the same thing.
Get-Process | Foreach-Object {Blah}
Get-Process | % {Blah}
? is a shortcut for Where-Object, so if you see people piping to ? that's what that is all about.The reason you don't need to do this to find the model and deviceID, is that there is only 1 reference to each physical device so for each drive in the target host you can assume the model and status will be the same for each partition on that drive.
Also for some more info on Associators and all that have a look here: http://www.codeproject.com/KB/system/WQLByExample.aspx
ASKER
Brilliant answers all my Questions!!!!
One thing now I have to figure out , How to add a new property (like : win32_timezone.caption ) to the existing psobject ($objdiskinfo)
One thing now I have to figure out , How to add a new property (like : win32_timezone.caption ) to the existing psobject ($objdiskinfo)
ASKER
Now few silly questions to annoy you.
1. What is %{} ? - You piped output of win32_diskdrive into this container is it same as an array @()
Few operation inside the %{} is bit difficult for a newbie like me understand. I understand the Associators of query , however why aren't you doing the same operation for $_.Model as you are doing for $_.deviceid..
Thing is I am writing more functions like this and I can only use wmi queries for data from the servers as none of they will have powershell. So it would be great to know how this is working so that I keep building my shared function scripts