Powershell History, Profiles, Functions and Aliases
Overview
This post outlines some basic Powershell behaviour around history, functions and aliases.
Powershell History
The Powershell history command (also aliased to h) is an alias to the Get-History cmdlet. This returns useful history information but only for the current session.
Get-PSReadLineOption will return a list of options for Powershell readline behaviour.
To retreive history across all Powershell sessions (Get-PSReadLineOption).HistorySavePath will return the path to the history file commonly used access multiple sessions:
PS> (Get-PSReadLineOption).HistorySavePath
/home/wmcdonald/.local/share/powershell/PSReadLine/ConsoleHost_history.txt
The path can be searched using Select-String (or its alias sls) as follows:
PS> sls <searchstring> (Get-PSReadLineOption).HistorySavePath
Powershell Profiles
In Powershell, Profiles are scripts that run automatically when the shell starts up. Different profiles can be set at granularity for users and computers.
On Windows systems, Powershell will run the ps1 script (if one exists) at the value defined in $PROFILE.CurrentUserCurrentHost. On a normal Windows system this would be Microsoft.PowerShell_Profile.ps1 under C:\Users\<username>\Documents\WindowsPowerShell\ where they will be sourced into the shell on startup.
The Linux equivalent value for $PROFILE.CurrentUserCurrentHost would be /home/<username>/.config/powershell/Microsoft.PowerShell_profile.ps1
$PROFILE is an automatic variable which includes the paths to profiles for the various levels of granularity. It can be explored by enumeration as shown:
PS> $PROFILE | Get-Member -Type All
TypeName: System.String
Name MemberType Definition
---- ---------- ----------
Clone Method System.Object Clone(), System.Object ICloneable.Clone()
CompareTo Method int CompareTo(System.Object value), int CompareTo(string strB), int IComparable.CompareTo(System.Object obj), i…
<output truncated>
Examine the specific granular properties on the object:
PS /home/wmcdonald> $PROFILE | Get-Member -Type NoteProperty
TypeName: System.String
Name MemberType Definition
---- ---------- ----------
AllUsersAllHosts NoteProperty string AllUsersAllHosts=/opt/microsoft/powershell/7/profile.ps1
AllUsersCurrentHost NoteProperty string AllUsersCurrentHost=/opt/microsoft/powershell/7/Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts NoteProperty string CurrentUserAllHosts=/home/wmcdonald/.config/powershell/profile.ps1
CurrentUserCurrentHost NoteProperty string CurrentUserCurrentHost=/home/wmcdonald/.config/powershell/Microsoft.PowerShell_profile.ps1
Powershell Functions
With this information, functions (or aliases) can be dropped into a file at $PROFILE.CurrentUserCurrentHost and would be available in the shell at startup:
For example:
function vpnstate {
Get-Process -name vpnui
&"C:\Program Files(x64)\Cisco\Cisco AnyConnect Secure Mobility Client\vpncli.exe" state
}
function vpnup {
Get-Process -name vpnui | Stop-Process
&"C:\Program Files(x64)\Cisco\Cisco AnyConnect Secure Mobility Client\vpncli.exe" connect VPN-PROFILE-NAME
}
function vpndown {
&"C:\Program Files(x64)\Cisco\Cisco AnyConnect Secure Mobility Client\vpncli.exe" disconnect
}
All functions can be enumerated using:
PS> Get-Item Function:
An Individual function’s definition using one of the three following methods:
PS> $function:test
PS> ${function:test-function}
PS> (Get-Command test).Definition
Powershell Aliases
Get-Alias lists all current aliases set in the environment.
New-Alias will create a new alias if one does not exist, or error if an alias exists.
Set-Alias will create a new alias, or update an existing alias.
As with Functions earlier, Aliases can be added to Profiles in order to ensure they’re loaded into an environment.
Further reading
History
- https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_history?view=powershell-7.4
- https://stackoverflow.com/questions/44104043/how-can-i-see-the-command-history-across-all-powershell-sessions-in-windows-serv
Profiles
- https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.4
- https://thesmashy.medium.com/helpful-functions-for-your-powershell-profile-9fece679f4d6
- https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_automatic_variables?view=powershell-7.4
Aliases
- https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_aliases?view=powershell-7.4
- https://stackoverflow.com/questions/24914589/how-to-create-permanent-powershell-aliases
- https://stackoverflow.com/questions/48093565/whats-the-difference-between-powershells-new-alias-and-set-alias-cmdlets