I use a small handful of my own PowerShell aliases and of course some of those included with PowerShell natively. There is a best practice around aliases in PowerShell, and that is to not use them in anything that is going to live longer than a one-time use. Therefore, do not use them in scripts, functions, and modules (except in the case where your module exports aliases). I would recommend not even using them in forum posts or emails or work-only documentation. Keep them away from your own personal documentation, too. You might know what spsv
, ndr
, rcjb
, and shcm
mean today, at this moment, but you may not a few months from now. They have a place, however. Use them in your console, or shell, to speed up what would otherwise be a longer, manually entered command. Let’s check my $PROFILE
script and see how many of my own PowerShell aliases I have.
Get-Content -Path $PROFILE | Select-String -Pattern '-alias'
Set-Alias -Name c -Value Clear-Host Set-Alias -Name psrh -Value Open-PSReadLineHistoryFile Set-Alias -Name sel -Value Select-Object Set-Alias -Name wa -Value Watch-Apartment Set-Alias -Name psgal -Value Show-PSGalleryProjectJob 'l','link' | ForEach-Object {Set-Alias -Name $_ -Value Find-Link} Set-Alias -Name cts -Value Convert-TextToSpeech
Based on the above command and its results, I have seven. Even that is too many to remember when they are not being used often. Well, I forgot one recently and I was annoyed I had to open my profile script file and search for -alias
. Sure, I could have used the above Get-Content
command I wrote and tried out a minute ago, but why? Why not avoid ever having to search for my aliases from inside a source file again. They exist in the PowerShell session; why not search there? I am already in the session.
My first thought was, why does Microsoft not indicate which aliases are built-in? There is a source property. It is just too bad that not many aliases include that information. It would be much simple to filter aliases that way, removing those that are not a part of a Microsoft.<something>.<something>
module. But, if you return this property there is often nothing. To begin with, there are currently 147 aliases on my machine.
(Get-Alias).Count 147
Only seven include a value in their source property.
Get-Alias | Where-Object Source -ne ''
CommandType Name Version Source ----------- ---- ------- ------ Alias fhx -> Format-Hex 7.0.0.0 Microsoft.PowerShell.Utility Alias gcb -> Get-Clipboard 7.0.0.0 Microsoft.PowerShell.Management Alias gin -> Get-ComputerInfo 7.0.0.0 Microsoft.PowerShell.Management Alias gtz -> Get-TimeZone 7.0.0.0 Microsoft.PowerShell.Management Alias scb -> Set-Clipboard 7.0.0.0 Microsoft.PowerShell.Management Alias stz -> Set-TimeZone 7.0.0.0 Microsoft.PowerShell.Management
Weird right? One command alias is from the Microsoft.PowerShell.Utility
module and six are from the Microsoft.PowerShell.Management
module. It is not like there are only one and six aliases, respectively, from each entire module. There are plenty more commands and aliases, as well. Take a look; I have included both modules. We will begin with the Microsoft.PowerShell.Utility
module.
((Get-Command -Module Microsoft.PowerShell.Utility).Name | ForEach-Object {Get-Alias -Definition $_ -ErrorAction SilentlyContinue}).Count 43 (Get-Command -Module Microsoft.PowerShell.Utility).Name | ForEach-Object {Get-Alias -Definition $_ -ErrorAction SilentlyContinue}
CommandType Name Version Source ----------- ---- ------- ------ Alias clv -> Clear-Variable Alias compare -> Compare-Object Alias diff -> Compare-Object Alias dbp -> Disable-PSBreakpoint Alias ebp -> Enable-PSBreakpoint Alias epal -> Export-Alias Alias epcsv -> Export-Csv Alias fc -> Format-Custom Alias fhx -> Format-Hex 7.0.0.0 Microsoft.PowerShell.Utility Alias fl -> Format-List Alias ft -> Format-Table Alias fw -> Format-Wide Alias gal -> Get-Alias Alias gerr -> Get-Error Alias gm -> Get-Member Alias gbp -> Get-PSBreakpoint Alias gcs -> Get-PSCallStack Alias gu -> Get-Unique Alias gv -> Get-Variable Alias group -> Group-Object Alias ipal -> Import-Alias Alias ipcsv -> Import-Csv Alias iex -> Invoke-Expression Alias irm -> Invoke-RestMethod Alias iwr -> Invoke-WebRequest Alias measure -> Measure-Object Alias nal -> New-Alias Alias nv -> New-Variable Alias ogv -> Out-GridView Alias rbp -> Remove-PSBreakpoint Alias rv -> Remove-Variable Alias select -> Select-Object Alias sls -> Select-String Alias sal -> Set-Alias Alias sbp -> Set-PSBreakpoint Alias set -> Set-Variable Alias sv -> Set-Variable Alias shcm -> Show-Command Alias sort -> Sort-Object Alias sleep -> Start-Sleep Alias tee -> Tee-Object Alias echo -> Write-Output Alias write -> Write-Output
And continue with the Microsoft.PowerShell.Management
module.
((Get-Command -Module Microsoft.PowerShell.Management).Name | ForEach-Object {Get-Alias -Definition $_ -ErrorAction SilentlyContinue}).Count 62 (Get-Command -Module Microsoft.PowerShell.Management).Name | ForEach-Object {Get-Alias -Definition $_ -ErrorAction SilentlyContinue}
CommandType Name Version Source ----------- ---- ------- ------ Alias ac -> Add-Content Alias clc -> Clear-Content Alias cli -> Clear-Item Alias clp -> Clear-ItemProperty Alias cvpa -> Convert-Path Alias copy -> Copy-Item Alias cp -> Copy-Item Alias cpi -> Copy-Item Alias cpp -> Copy-ItemProperty Alias dir -> Get-ChildItem Alias gci -> Get-ChildItem Alias ls -> Get-ChildItem Alias gcb -> Get-Clipboard 7.0.0.0 Microsoft.PowerShell.Management Alias gin -> Get-ComputerInfo 7.0.0.0 Microsoft.PowerShell.Management Alias cat -> Get-Content Alias gc -> Get-Content Alias type -> Get-Content Alias gi -> Get-Item Alias gp -> Get-ItemProperty Alias gpv -> Get-ItemPropertyValue Alias gl -> Get-Location Alias pwd -> Get-Location Alias gps -> Get-Process Alias ps -> Get-Process Alias gdr -> Get-PSDrive Alias gsv -> Get-Service Alias gtz -> Get-TimeZone 7.0.0.0 Microsoft.PowerShell.Management Alias ii -> Invoke-Item Alias mi -> Move-Item Alias move -> Move-Item Alias mv -> Move-Item Alias mp -> Move-ItemProperty Alias ni -> New-Item Alias mount -> New-PSDrive Alias ndr -> New-PSDrive Alias popd -> Pop-Location Alias pushd -> Push-Location Alias del -> Remove-Item Alias erase -> Remove-Item Alias rd -> Remove-Item Alias ri -> Remove-Item Alias rm -> Remove-Item Alias rmdir -> Remove-Item Alias rp -> Remove-ItemProperty Alias rdr -> Remove-PSDrive Alias ren -> Rename-Item Alias rni -> Rename-Item Alias rnp -> Rename-ItemProperty Alias rvpa -> Resolve-Path Alias scb -> Set-Clipboard 7.0.0.0 Microsoft.PowerShell.Management Alias si -> Set-Item Alias sp -> Set-ItemProperty Alias cd -> Set-Location Alias chdir -> Set-Location Alias sl -> Set-Location Alias stz -> Set-TimeZone 7.0.0.0 Microsoft.PowerShell.Management Alias saps -> Start-Process Alias start -> Start-Process Alias sasv -> Start-Service Alias kill -> Stop-Process Alias spps -> Stop-Process Alias spsv -> Stop-Service
In the end, the Microsoft.PowerShell.Utility
has 43 aliases and the Microsoft.PowerShell.Management
module has 63 aliases. Maybe there is a good reason for the source, not being included most of the time. But, we are here to make my aliases easier to find. The source property is not a settable property, therefore, we are going to use the Description
property to indicate when an alias is one of mine. Here are my aliases from earlier, each with a new addition to their Description
property. It is my name.
Set-Alias -Name c -Value Clear-Host -Description 'tommymaynard' Set-Alias -Name psrh -Value Open-PSReadLineHistoryFile -Description 'tommymaynard' Set-Alias -Name sel -Value Select-Object -Description 'tommymaynard' Set-Alias -Name wa -Value Watch-Apartment -Description 'tommymaynard' Set-Alias -Name psgal -Value Show-PSGalleryProjectJob -Description 'tommymaynard' 'l','link' | ForEach-Object {Set-Alias -Name $_ -Value Find-Link -Description 'tommymaynard'} Set-Alias -Name cts -Value Convert-TextToSpeech -Description 'tommymaynard'
Now, after my profile script runs, I can invoke a modified Get-Alias
command to return just my aliases from the current PowerShell session.
Get-Alias | Where-Object -Property Description -eq 'tommymaynard'
CommandType Name Version Source ----------- ---- ------- ------ Alias c -> Clear-Host Alias cts -> Convert-TextToSpeech Alias l -> Find-Link Alias link -> Find-Link Alias psgal -> Show-PSGalleryProjectJob Alias psrh -> Open-PSReadLineHistoryFile Alias sel -> Select-Object Alias wa -> Watch-Apartment
This post would not be complete if there was no new function to add to my $PROFILE
script. So, with that, here is that new function and alias. Notice I added the description to the new alias, too!
Set-Alias -Name gmal -Value Get-MyAlias -Description 'tommymaynard' function Get-MyAlias { Get-Alias | Where-Object -Property Description -eq 'tommymaynard' }
gmal
CommandType Name Version Source ----------- ---- ------- ------ Alias c -> Clear-Host Alias cts -> Convert-TextToSpeech Alias gmal -> Get-MyAlias Alias l -> Find-Link Alias link -> Find-Link Alias psgal -> Show-PSGalleryProjectJob Alias psrh -> Open-PSReadLineHistoryFile Alias sel -> Select-Object Alias wa -> Watch-Apartment