?
Solved

Getting Server name in this powershell script

Posted on 2014-10-28
6
Medium Priority
?
404 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
5 Comments
 
LVL 41

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 41

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 41

Accepted Solution

by:
footech earned 1500 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

[Webinar] Improve your customer journey

A positive customer journey is important in attracting and retaining business. To improve this experience, you can use Google Maps APIs to increase checkout conversions, boost user engagement, and optimize order fulfillment. Learn how in this webinar presented by Dito.

Question has a verified solution.

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

When trying to connect from SSMS v17.x to a SQL Server Integration Services 2016 instance or previous version, you get the error “Connecting to the Integration Services service on the computer failed with the following error: 'The specified service …
This month, Experts Exchange sat down with resident SQL expert, Jim Horn, for an in-depth look into the makings of a successful career in SQL.
Viewers will learn how to use the SELECT statement in SQL to return specific rows and columns, with various degrees of sorting and limits in place.
Exchange organizations may use the Journaling Agent of the Transport Service to archive messages going through Exchange. However, if the Transport Service is integrated with some email content management application (such as an anti-spam), the admin…

594 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