Custom PowerShell prompts [closed]
This is modified version of jaykul's prompt. The benefit is that
-there is a current history id, so you can invoke previous items from history very easily (you know the id)-it's a little reminder - I add my tasks to the prompt so I don't forget them (see the sshot)
function prompt { $err = !$? $origOfs = $ofs; $ofs = "|" $toPrompt = "$($global:__PromptVars)" $ofs = $origOfs; if ($toPrompt.Length -gt 0) { Write-Host "$($toPrompt) >" -ForegroundColor Green -NoNewline } $host.UI.RawUI.WindowTitle = "PS1 > " + $(get-location) # store the current color, and change the color of the prompt text $script:fg = $Host.UI.RawUI.ForegroundColor # If there's an error, set the prompt foreground to "Red" if($err) { $Host.UI.RawUI.ForegroundColor = 'Red' } else { $Host.UI.RawUI.ForegroundColor = 'Yellow' } # Make sure that Windows and .Net know where we are at all times [Environment]::CurrentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath # Determine what nesting level we are at (if any) $Nesting = "$([char]0xB7)" * $NestedPromptLevel # Generate PUSHD(push-location) Stack level string $Stack = "+" * (Get-Location -Stack).count # Put the ID of the command in, so we can get/invoke-history easier # eg: "r 4" will re-run the command that has [4]: in the prompt $nextCommandId = (Get-History -count 1).Id + 1 # Output prompt string # Notice: no angle brackets, makes it easy to paste my buffer to the web Write-Host "[${Nesting}${nextCommandId}${Stack}]:" -NoNewLine # Set back the color $Host.UI.RawUI.ForegroundColor = $script:fg if ($toPrompt.Length -gt 0) { $host.UI.RawUI.WindowTitle = "$($toPrompt) -- " + $host.UI.RawUI.WindowTitle } " "}function AddTo-Prompt($str) { if (!$global:__PromptVars) { $global:__PromptVars = @() } $global:__PromptVars += $str}function RemoveFrom-Prompt($str) { if ($global:__PromptVars) { $global:__PromptVars = @($global:__PromptVars | ? { $_ -notlike $str }) }}
Here's mine:
function prompt { # our theme $cdelim = [ConsoleColor]::DarkCyan $chost = [ConsoleColor]::Green $cloc = [ConsoleColor]::Cyan write-host "$([char]0x0A7) " -n -f $cloc write-host ([net.dns]::GetHostName()) -n -f $chost write-host ' {' -n -f $cdelim write-host (shorten-path (pwd).Path) -n -f $cloc write-host '}' -n -f $cdelim return ' '}
It uses this helper function:
function shorten-path([string] $path) { $loc = $path.Replace($HOME, '~') # remove prefix for UNC paths $loc = $loc -replace '^[^:]+::', '' # make path shorter like tabs in Vim, # handle paths starting with \\ and . correctly return ($loc -replace '\\(\.?)([^\\])[^\\]*(?=\\)','\$1$2')}
Here is my prompt function
function prompt() { if ( Test-Wow64 ) { write-host -NoNewLine "Wow64 " } if ( Test-Admin ) { write-host -NoNewLine -f red "Admin " } write-host -NoNewLine -ForegroundColor Green $(get-location) foreach ( $entry in (get-location -stack)) { write-host -NoNewLine -ForegroundColor Red '+'; } write-host -NoNewLine -ForegroundColor Green '>' ' '}