How can I change the PowerShell prompt to show just the parent directory and current directory?

核能气质少年 提交于 2020-04-29 10:02:18

问题


I would like to shorten my PowerShell prompt so that it just shows the parent directory and the current directory. For example, if the pwd is

C:\Users\ndunn\OneDrive\Documents\Webucator\ClassFiles\python-basics\Demos

I want the prompt to be:

PS ..\python-basics\Demos> 

I can get it to be just PS ..\Demos> by changing the prompt() function in the Profile file:

  1. Find location of Profile file by running $profile in PowerShell.
  2. Open (or create and open) Profile file.
  3. Change (or add) the following prompt() function:

function prompt
{
  $folder = "$( ( get-item $pwd ).Name )"
  "PS ..\$folder> "
}

I tried using split() and negative indexing, but wasn't able to get it to work.

Also, I only want to do this if the pwd is at least two levels down. If the pwd is something like C:\folder\folder, I'd like to show the default prompt.

Any ideas?


回答1:


Try the following function, which should work on Windows and Unix-like platforms (in PowerShell Core) alike:

function global:prompt {
  $dirSep = [IO.Path]::DirectorySeparatorChar
  $pathComponents = $PWD.Path.Split($dirSep)
  $displayPath = if ($pathComponents.Count -le 3) {
    $PWD.Path
  } else {
    '…{0}{1}' -f $dirSep, ($pathComponents[-2,-1] -join $dirSep)
  }
  "PS {0}> " -f $displayPath
}

Note that I've chosen single character (HORIZONTAL ELLIPSIS, U+2026) to represent the omitted part of the path, because .. could be confused with referring to the parent directory.

Note: The non-ASCII-range character is only properly recognized if the enclosing script file - assumed to be your $PROFILE file - is either saved as UTF-8 with BOM[1] or as UTF-16LE ("Unicode").

If, for some reason, that doesn't work for you, use three distinct periods ('...' instead of '…'), though note that that will result in a longer prompt.


[1] The BOM is only a necessity in Windows PowerShell; by contrast, PowerShell Core assumes UTF-8 by default, so no BOM is needed.




回答2:


Try this (too long for a comment):

function prompt 
{
    $aux=$executionContext.SessionState.Path.CurrentFileSystemLocation.Path -Split '\\|\/'
    if ( $aux.Count -le 3 ) {
        Write-Host ("PS $($aux -join '\')>") -NoNewline # -ForegroundColor Cyan
    } else {
        Write-Host ("PS $($aux[0])\..\$($aux[-2..-1] -join '\')>") -NoNewline # -ForegroundColor Cyan
    }
    return " "
}



回答3:


These other replies were much more involved. Even so, here's mine. If it's greater than 30 characters, we shorten the path. Done.

Function Prompt {
    If ("$($executionContext.SessionState.Path.CurrentLocation)>".Length -le 30) {
        "PS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) ";
    } Else {
        "PS ...\$(Split-Path -Path $executionContext.SessionState.Path.CurrentLocation -Leaf)$('>' * ($nestedPromptLevel + 1)) ";
    } # End If.
} # End Function: Prompt.



来源:https://stackoverflow.com/questions/58574397/how-can-i-change-the-powershell-prompt-to-show-just-the-parent-directory-and-cur

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!