Getting Server name in this powershell script

Here is the powershell script:

$TotalGB = @{Name=”Capacity(GB)”;expression={[math]::round(($_.Capacity/ 1073741824),2)}}
$FreeGB = @{Name=”FreeSpace(GB)”;expression={[math]::round(($_.FreeSpace / 1073741824),2)}}
$FreePerc = @{Name=”Free(%)”;expression={[math]::round(((($_.FreeSpace / 1073741824)/($_.Capacity / 1073741824)) * 100),0)}}

function get-mountpoints {
$volumes = Get-WmiObject -computer $server win32_volume | Where-object {$_.DriveLetter -eq $null}
$volumes | Select SystemName, Label, $TotalGB, $FreeGB, $FreePerc | Format-Table -AutoSize
}

$servers = (Get-Content .\servers.txt)

foreach ($server in $servers){
get-mountpoints
}

Open in new window


I want to save the output of this query in csv file. But whenever i try the out command only the last server name in my input file is processed and output is shown. Also I wanted to display the server names as well in the output file which I'm using as input in the servers.txt file to this query.

I'm new to powershell. Please have a look and suggest your views.

Thanks in advance.
Abhinav SinghSoftware EngineerAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

footechCommented:
If you're going to output objects to .CSV using Export-CSV, they can't be sent to any of the Format commands first.  So, something like this wouldn't work.
$volumes | Select SystemName, Label, $TotalGB, $FreeGB, $FreePerc | Format-Table -AutoSize | Export-CSV file.csv
You could just substitute the Export-CSV cmdlet for Format-Table, but then you'd either need to dynamically name the file so that it is not being overwritten each time through the foreach loop, or if you're using PS 3.0+, then you can use the -append parameter with Export-CSV.

I suggest you remove the Format-Table command from your function to make it more flexible.
function get-mountpoints {
$volumes = Get-WmiObject -computer $server win32_volume | Where-object {$_.DriveLetter -eq $null}
$volumes | Select SystemName, Label, $TotalGB, $FreeGB, $FreePerc
}

Open in new window

Then you can use either of the following:
@(foreach ($server in (Get-Content .\servers.txt)){
get-mountpoints
}) | Export-CSV file.csv -notype

#or
Get-Content .\servers.txt | ForEach `
{
    $server = $_
    get-mountpoints
} | Export-CSV file.csv -notype

Open in new window

I'm not sure what you're getting at by wanting the server name.  The server name is already in the output by merit of the "SystemName" property.
0
Abhinav SinghSoftware EngineerAuthor Commented:
Hey footech,

Thanks for your reply.
Actually in "SystemName", I'm getting the Name on which my SQL physical instances are hosted. Thta's the reason I wanted to include server name in my output.
Anways, I found an answer to this question in this forum itself.

Can you please resolve one more query?
I wanted to display only those mointpoints, which have capacity more than 0gb.
I'm currently using this piece of code

foreach ($server in $servers){

if ($_.”Capacity(GB)” -ne 0) {
get-mountpoints
}

}

Open in new window


But it's not working. Please look into this.

Thanks
0
footechCommented:
SystemName comes from the output of the Get-WmiObject command, so it should always reflect the server that command was run against (i.e. should be the same as $server).  Since you said you have an answer for that though I would dwell on it further.

You can just change this line in the function to filter on capacity.
$volumes = Get-WmiObject -computer $server win32_volume | Where-object {$_.DriveLetter -eq $null -and $_.Capacity -gt 0}

Open in new window

0
Abhinav SinghSoftware EngineerAuthor Commented:
I tried your above statement, but it's not working.
Still showing volumes with zero capacity.
Kindly suggest some alternatives.

Also will it be possible for you to modify the script so that I can get disk space information of the physical drives present on the servers (D:, E:, etc.) except C: Drive. SInce it is not monitored by our team.

Thanks in advance
0
footechCommented:
After changing that line you will need to run the code again to recreate the function.  I've tested and it's working good.

If you want other drives, just change the Where-Object condition.  The following should probably work for you.
$volumes = Get-WmiObject -computer $server win32_volume | Where-object {$_.DriveLetter -ne "C:\" -and $_.Capacity -gt 0}

Open in new window

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Microsoft SQL Server

From novice to tech pro — start learning today.