Solved

Getting Server name in this powershell script

Posted on 2014-10-28
6
362 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

This script can help you clean up your user profile database by comparing profiles to Active Directory users in a particular OU, and removing the profiles that don't match.
A quick Powershell script I wrote to find old program installations and check versions of a specific file across the network.
Via a live example, show how to backup a database, simulate a failure backup the tail of the database transaction log and perform the restore.
Via a live example, show how to set up a backup for SQL Server using a Maintenance Plan and how to schedule the job into SQL Server Agent.

734 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