In part I of Put the Alias Description Property to Work, I showed and explained how to add a description property to each of my personal, profile script-created aliases. This allowed me to use a basic function, that filtered the Get-Alias results to return only my aliases. In this post, we will take this one step further and we will add descriptions to the built-in aliases in PowerShell. If you remember, we determined that most of the built-in aliases do not include a source property. Therefore, sorting or filtering on that property is of little value.
The source property is not a settable property, meaning that no matter how hard I try, I cannot edit it. The Description property, as we learned, is open for me to make changes. This is also true with built-in aliases and not just the aliases I create. Here is what we are going to do. All the aliases resolve to a command, and all but four of those commands have a source property. We are going to acquire a command’s source and set it as the description of its alias. This might make more sense with some examples, so let’s start there.
But before we do, let’s look at the default properties returned by Get-Alias.
Get-Alias | Get-Random
CommandType Name Version Source ----------- ---- ------- ------ Alias pwd -> Get-Location
Get-Alias returns CommandType, Name, Version, and Source. Kind of. Name is really a property called DisplayName. It may be better to know that now. In the first, real example, we are also going to use Get-Random to randomly select an alias for us. Then, we will return its ResolvedCommandName, DisplayName, Description, and Options properties.
$Alias = Get-Alias | Get-Random
Get-Alias -Name $Alias |
Select-Object ResolvedCommandName,DisplayName,Description,Options
ResolvedCommandName DisplayName Description Options ------------------- ----------- ----------- ------- Connect-PSSession cnsn -> Connect-PSSession ReadOnly
Notice that currently, its Description property is blank. In the next example, we will use the value stored in $Alias and run it through a ForEach-Object loop. Take a look at the PowerShell now, and I will do that recently experimented with, line-by-line explanation further below.
Get-Alias -Name $Alias | ForEach-Object {
if ($_.Description -eq '') {
$Params = @{
Name = $_.Name
Value = $_.ResolvedCommandName
Description = if ((Get-Command -Name $_.ResolvedCommandName).Source) {
((Get-Command -Name $_.ResolvedCommandName).Source)
} else {'None'}
Option = $_.Options
Force = $true
}
Set-Alias @Params -Verbose
}
}
VERBOSE: Performing the operation "Set Alias" on target "Name: cnsn Value: Connect-PSSession".
Line 1: Pipe our single alias into a ForEach-Object loop.
Line 2: Continue into an if construct if the alias’ description is empty. If it is not, we would move on to the next alias if there were more than just one.
Line 3: Create a hash table and store it in the $Params variable.
Line 4, 5: Add the name and the resolved command name into the Name and Value keys, respectively.
Line 6 – 8: Add a description to the Description key based on whether or not there is a source. If there is a source, add it, if there is not a source add the string None.
Line 9, 10: Add the options and $true value into the Option and Force keys, respectively.
Line 12: Invoke the Set-Alias command, splatting the $Params hash table as parameters and associated parameter values.
Let’s rerun the command we did just a minute ago.
Get-Alias -Name $Alias |
Select-Object ResolvedCommandName,DisplayName,Description,Options
ResolvedCommandName DisplayName Description Options ------------------- ----------- ----------- ------- Connect-PSSession cnsn -> Connect-PSSession Microsoft.PowerShell.Core ReadOnly
We have taken the source of the command Connect-PSSession and placed its value into the description of an alias that resolves to Connect-PSSession. It is not genius, but it is something!
Moving on, the next command pipes out all the known aliases and the values in each of the included properties. I will only include the first ten, as there are almost 150.
Get-Alias |
Select-Object ResolvedCommandName,DisplayName,Description,Options
ResolvedCommandName DisplayName Description Options ------------------- ----------- ----------- ------- Where-Object ? -> Where-Object ReadOnly, AllScope ForEach-Object % -> ForEach-Object ReadOnly, AllScope Add-Content ac -> Add-Content ReadOnly Clear-Host c -> Clear-Host tommymaynard None Get-Content cat -> Get-Content None Set-Location cd -> Set-Location AllScope Set-Location chdir -> Set-Location None Clear-Content clc -> Clear-Content ReadOnly Clear-Host clear -> Clear-Host None Clear-History clhy -> Clear-History ReadOnly
This should look familiar. There are a couple of differences in this code block compared to the one above. One, we are piping in all of the aliases (not just one), and two, there is no Verbose parameter included when the Set-Alias command is invoked. We do not need to output the change made to each alias. Yeah, no thanks.
Get-Alias | ForEach-Object {
if ($_.Description -eq '') {
$Params = @{
Name = $_.Name
Value = $_.ResolvedCommandName
Description = if ((Get-Command -Name $_.ResolvedCommandName).Source) {
((Get-Command -Name $_.ResolvedCommandName).Source)
} else {'None'}
Option = $_.Options
Force = $true
}
Set-Alias @Params
}
}
This is the same command we saw earlier. I have only included the first ten here, as well. Notice the changes made to the Description property for each alias. Now I can easily see which alias goes with which source.
Get-Alias |
Select-Object ResolvedCommandName,DisplayName,Description,Options
ResolvedCommandName DisplayName Description Options ------------------- ----------- ----------- ------- Where-Object ? -> Where-Object Microsoft.PowerShell.Core ReadOnly, AllScope ForEach-Object % -> ForEach-Object Microsoft.PowerShell.Core ReadOnly, AllScope Add-Content ac -> Add-Content Microsoft.PowerShell.Management ReadOnly Clear-Host c -> Clear-Host tommymaynard None Get-Content cat -> Get-Content Microsoft.PowerShell.Management None Set-Location cd -> Set-Location Microsoft.PowerShell.Management AllScope Set-Location chdir -> Set-Location Microsoft.PowerShell.Management None Clear-Content clc -> Clear-Content Microsoft.PowerShell.Management ReadOnly Clear-Host clear -> Clear-Host None None Clear-History clhy -> Clear-History Microsoft.PowerShell.Core ReadOnly
Like all worthy PowerShell code, I am going to wrap this in a function, and for the foreseeable future, copy this into my profile script. There is one change in this version that should be mentioned. The Scope parameter is now being included inside the $Params hash table with the Global value. Like the other parameters and parameters values in this hash table, it will be splatted onto the Set-Alias cmdlet when it is invoked. While the Scope parameter is not required with Get-Alias, it absolutely is with Set-Alias. We want the aliases that exist outside the function to be the ones we modify.
function Set-AliasDescription
Get-Alias | ForEach-Object {
if ($_.Description -eq '') {
$Params = @{
Name = $_.Name
Value = $_.ResolvedCommandName
Description = if ((Get-Command -Name $_.ResolvedCommandName).Source) {
((Get-Command -Name $_.ResolvedCommandName).Source)
} else {'None'}
Option = $_.Options
Force = $true
Scope = 'Global'
}
Set-Alias @Params
}
}
Set-AliasDescription
With the descriptions set, we can filter such as in the next two examples. Remember, the Get-Alias Description property is not displayed by default.
Get-Alias | Where-Object -Property Description -eq 'None'
CommandType Name Version Source ----------- ---- ------- ------ Alias clear -> Clear-Host Alias cls -> Clear-Host Alias man -> help Alias md -> mkdir
Get-Alias | Where-Object -Property Description -like '*core'
CommandType Name Version Source ----------- ---- ------- ------ Alias ? -> Where-Object Alias % -> ForEach-Object Alias clhy -> Clear-History Alias cnsn -> Connect-PSSession Alias dnsn -> Disconnect-PSSession Alias etsn -> Enter-PSSession Alias exsn -> Exit-PSSession Alias foreach -> ForEach-Object Alias gcm -> Get-Command Alias ghy -> Get-History Alias gjb -> Get-Job Alias gmo -> Get-Module Alias gsn -> Get-PSSession Alias h -> Get-History Alias history -> Get-History Alias icm -> Invoke-Command Alias ihy -> Invoke-History Alias ipmo -> Import-Module Alias nmo -> New-Module Alias nsn -> New-PSSession Alias oh -> Out-Host Alias r -> Invoke-History Alias rcjb -> Receive-Job Alias rcsn -> Receive-PSSession Alias rjb -> Remove-Job Alias rmo -> Remove-Module Alias rsn -> Remove-PSSession Alias sajb -> Start-Job Alias spjb -> Stop-Job Alias where -> Where-Object Alias wjb -> Wait-Job





