Author Posts

July 1, 2015 at 3:06 am

I need to come up with a way to show correct name for the server. For now, I would like to hard-code the server.
For example, if the Name is A,
then the name should be webserver001.
If B

This is my current command for it, but I am not sure how to add a column to represent the column names.

get-psdrive -PSProvider filesystem | Format-Table -Wrap -AutoSize -Property Root,@{Name="UsedGB";Expression={[math]::round($_.used/1gb,2)}}, @{Name="FreeGB";Expression={[math]::round($,2)}}, @{Name="PctFree";expression={$$$_.used)*100 –as [int]}}

What is what it does:

Root UsedGB FreeGB PctFree
—- —— —— ——-
A:\ 27.62 49.91 64
B:\ 2.37 73.65 97
C:\ 60.43 0.56 1
D:\ 0 0
E:\ 6.64 105.46 94
F:\ 3.51 96.49 96
G:\ 11.98 88.01 88
H:\ 9.75 92.12 90
I:\ 32.4 432.72 93
J:\ 27.62 49.91 64
K:\ 27.62 49.91 64
Q:\ 7037.5 4137.5 37
Z:\ 27.62 49.91 64

This is what I want it to do:
Root UsedGB FreeGB PctFree ServerName
—- —— —— ——- web001
A:\ 27.62 49.91 64 web002
B:\ 2.37 73.65 97 web003
C:\ 60.43 0.56 1 web004
D:\ 0 0 web005
E:\ 6.64 105.46 94 web006
F:\ 3.51 96.49 96 web007
G:\ 11.98 88.01 88 web008
H:\ 9.75 92.12 90 web009
I:\ 32.4 432.72 93 web010
J:\ 27.62 49.91 64 web011
K:\ 27.62 49.91 64 web012
Q:\ 7037.5 4137.5 37 web013
Z:\ 27.62 49.91 64 web014

July 1, 2015 at 4:38 am

You should setup an alias table. It could be done numerous ways with a PSObject or in this example a hashtable. You can build a hashtable manually for reference:

$aliasTable = @{}

Or if the servers are sequentially ordered as A = 1, can build it dynamically using ASCII char codes (i.e. char code 65 is a capital A):

$aliasTableV2 = @{}
for ($i=1;$i -le 10;$i++){
    $aliasTableV2.Add([char]($i +64)+":\", "Web$i")

Once you have a lookup table, then it's as simple as:

PS C:\Windows\System32\WindowsPowerShell\v1.0> $aliasTable.Get_Item("F:\")

You command would look like this:

Get-PSDrive -PSProvider FileSystem | 
Format-Table -Wrap -AutoSize -Property Root,
                                       @{Name="PctFree";Expression={$$$_.used)*100 –as [int]}}

July 1, 2015 at 4:57 am

If they are sequential, another approach is foregoing the alias table and reversing what I did above with subtraction versus addition to get the server number:

$root = "G:\"
"Web" + ([int][char]($root -Split ":")[0] -64)

Get the drive (G:\), split it at the semicolon into an array, get the first index (i.e. G), subtract 64 and convert the character code to an integer. Somewhat complex, but it works and no alias table is needed (seems like the coffee is working this morning):

Get-PSDrive -PSProvider FileSystem | 
Format-Table -Wrap -AutoSize -Property Root,
                                       @{Name="PctFree";Expression={$$$_.used)*100 –as [int]}}
                                       @{Name="Server";Expression={"Web" + ([int][char]($_.Root -Split ":")[0] -64)}}

July 1, 2015 at 5:33 am

And what if i needed to add another column for description, how would I do that?

July 1, 2015 at 6:06 am

That wasn't part of the original requirements. Keep in mind $alias is a manually generated PSObject. You could put this data in a CSV and use Import-CSV the same way.

$alias = @()
$alias += New-Object -TypeName PSObject -Property @{DriveLetter="A:\";WebServer="Web1";Description="This is for website"}
$alias += New-Object -TypeName PSObject -Property @{DriveLetter="B:\";WebServer="Web2";Description="This is for website"}

Get-PSDrive -PSProvider FileSystem | 
Format-Table -Wrap -AutoSize -Property Root,
                                       @{Name="PctFree";Expression={$$$_.used)*100 –as [int]}}
                                       @{Name="Server";Expression={$root = $_.Root; $alias | Where{$_.DriveLetter -eq $root} | Select -ExpandProperty WebServer}}
                                       @{Name="Description";Expression={$root = $_.Root; $alias | Where{$_.DriveLetter -eq $root} | Select -ExpandProperty Description}}

If the information was in AD for the description, you could also use Get-ADComputer with the original hashtable and do something like this:

@{Name="Description";Expression={Get-ADComputer -Identity ("Web" + ([int][char]($root -Split ":")[0] -64)) -Properties Description | Select -ExpandProperty Description}}

July 1, 2015 at 6:29 am

I am running on Version 2.

PS C:\_> get-host

Name : ConsoleHost
Version : 2.0
InstanceId : 22110d0d-7482-4969-800c-93f2d73a9ace
UI : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture : en-US
CurrentUICulture : en-US
PrivateData : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace : System.Management.Automation.Runspaces.LocalRunspace

i am getting this as a response:
PS C:\_> .\foo.ps1

Root UsedGB FreeGB PctFree
—- —— —— ——-
A:\ 30.31 47.22 61
B:\ 2.39 73.63 97
C:\ 60.43 0.56 1
D:\ 0 0
E:\ 7.25 104.85 94
F:\ 4.52 95.47 95
G:\ 12.11 87.89 88
H:\ 11.98 89.89 88
I:\ 46.35 418.78 90
J:\ 30.31 47.22 61
K:\ 30.31 47.22 61
Q:\ 7046.18 4128.82 37
Z:\ 30.31 47.21 61

Name Value
—- —–
Name Server
Expression $root = $_.Root; $alias | Where{$_.DriveLetter -eq $root} | Select -ExpandProperty WebServer
Name Description
Expression $root = $_.Root; $alias | Where{$_.DriveLetter -eq $root} | Select -ExpandProperty Description


July 1, 2015 at 6:42 am

Commas were missing on for the added calculated properties:

$alias = @()
$alias += New-Object -TypeName PSObject -Property @{DriveLetter="A:\";WebServer="Web1";Description="This is for website"}
$alias += New-Object -TypeName PSObject -Property @{DriveLetter="B:\";WebServer="Web2";Description="This is for website"}

Get-PSDrive -PSProvider FileSystem | 
Format-Table -Wrap -AutoSize -Property Root,
                                       @{Name="PctFree";Expression={$$$_.used)*100 –as [int]}},
                                       @{Name="Server";Expression={$root = $_.Root; $alias | Where{$_.DriveLetter -eq $root} | Select -ExpandProperty WebServer}},
                                       @{Name="Description";Expression={$root = $_.Root; $alias | Where{$_.DriveLetter -eq $root} | Select -ExpandProperty Description}}

July 1, 2015 at 9:52 am

Instead of using drive letters, what if it was server ip addresses used instead?

July 1, 2015 at 10:07 am

Can you provide what you are actually doing? What you data you are working with and the expected end results? The community is here to assist, but vague requirements will just waste time.

July 1, 2015 at 10:59 am

I need to check disk space capacity on 30 servers. Ideally using IP Addresses would work better.

I have used the following but struggle to get to custom columns to indicate info on what is hosted on each server i.e. like the previous post regarding adding a column for the domain name and the description.

below is something i am using

$ServerName = Get-Content "C:\_\servers.txt"
$Partition = Get-Content "C:\_\partition.txt"
$ConvertToGB = (1024 * 1024 * 1024)

"Server" + " " + "Size" + " " + "Free" + " "

foreach ($Server in $ServerName) {
$disk = Get-WmiObject Win32_LogicalDisk -ComputerName $Server -Filter $Partition | Select-Object Size,FreeSpace
$Server + " " + ([math]::round(($disk.Size / $ConvertToGB),2)) + " GB" + " " + ([math]::round((($disk.FreeSpace / $ConvertToGB)),2)) + " GB"

The server.txt files contains ip addresses of each server

format inside text file
etc etc

The partition txt file contains:

However, every server has a different letter for its hard drive.

Bottom line that script which you created works but if could use ip addresses of the servers AND the Drive Letter of each server then we have winner.

July 1, 2015 at 11:35 am

If you are looking for a disk report, there are a lot of examples already created, such as:

They will not care if you use an IP address or DNS name for a computer. As every system is different, it's probably simpler to not filter the partition and just pull all partitions on that server.

July 1, 2015 at 11:47 am

Thanks Rob much appreciated.

Will have a look.

Do you have examples of powershell scripts which use text files as an external source for references certain data like computer names or any data.

and going line by line...tried foreach and for loop and it prints the entire data on file which is not what i wanted but line by line.

text files or xml files ....any file for that matter.

July 1, 2015 at 11:58 am

There an tons of examples of what you are asking for.

If a file is formatted like:


foreach ($computer in (Get-Content C:\Computers.txt) { $computer }

XML files is a bit ominous. Powershell can export data as XML, which can be imported using Import-CliXML. If you just want to parse XML data, there are many examples on working with XML using many methods such as XPath. You can also easily import CSV's with Import-CSV. If you are just starting, I would lookup Month Of Lunches book by Don Jones to help with understanding Powershell fundamentals.

July 1, 2015 at 10:23 pm

Yeah, basically an idea is to have a configuration file for support and system administrators to add or remove data.
I think xml looks more in order because parameter names make it easier for humans to read.

July 2, 2015 at 5:09 am

You should take a look at JSON. It is similar to XML but as you appropriately put, it is supposed to be more "human readable". There is a ConvertTo-JSON and ConvertFrom-JSON to export and import data into Powershell respectively.