Solved

Getting Server name in this powershell script

Posted on 2014-10-28
6
360 Views
Last Modified: 2014-10-31
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.
0
Comment
Question by:Abhinav Singh
  • 3
  • 2
6 Comments
 
LVL 40

Expert Comment

by:footech
ID: 40409222
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
 

Author Comment

by:Abhinav Singh
ID: 40409262
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
 
LVL 40

Expert Comment

by:footech
ID: 40409284
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
 

Author Comment

by:Abhinav Singh
ID: 40409301
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
 
LVL 40

Accepted Solution

by:
footech earned 500 total points
ID: 40409614
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

Featured Post

Problems using Powershell and Active Directory?

Managing Active Directory does not always have to be complicated.  If you are spending more time trying instead of doing, then it's time to look at something else. For nearly 20 years, AD admins around the world have used one tool for day-to-day AD management: Hyena. Discover why

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Ever wondered why sometimes your SQL Server is slow or unresponsive with connections spiking up but by the time you go in, all is well? The following article will show you how to install and configure a SQL job that will send you email alerts includ…
A project that enables an administrator to perform actions within a user session context not just at the time of login but any time later on day(s) or week(s) later.
This video shows, step by step, how to configure Oracle Heterogeneous Services via the Generic Gateway Agent in order to make a connection from an Oracle session and access a remote SQL Server database table.
Via a live example, show how to extract information from SQL Server on Database, Connection and Server properties

756 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question