68

I'm using PowerShell on Windows 7. How can I configure PowerShell so that it only displays the current folder name (instead of the full path) in the shell prompt?

For example, instead of C:\folder\directory\name>, I want name>.

2
  • If you want the prompt with a path relative to your home directory, this worked for me: function prompt { "[$((''+$PWD).replace($HOME, '~'))]> " }
    – Chris
    Jun 6, 2020 at 4:34
  • 1
    The question has already been answered, but I created a shortened Prompt for Poweshell that includes a bit more information. Has shortened names for some common directories (limited atm, may include more) and shortens home drive to "\": gist.github.com/1nVitr0/486b238a1e9a361dd0a2f6fc92f86d4f. Example: "$ ~\Drv\Docs\pers\proj\vsc\exts\daily-timelog >" Maybe it'll help somebody Jan 24, 2021 at 14:40

10 Answers 10

111

You have to customize the prompt function in your PowerShell profile (%userprofile%\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1); it may be blank or even not exist if you have never modified it before.

  1. Open your profile (e.g., open the aforementioned file or while in PowerShell, Notepad $profile)

  2. Add the following to your profile:

    function prompt {
      $p = Split-Path -leaf -path (Get-Location)
      "$p> "
    }
    
  3. Save the profile

  4. Restart PowerShell

    Optional. If you get a message that says you are not allowed to run scripts, then you need to copy/paste this line in PowerShell:

    Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
    

    and restart.

Windows PowerShell execution policies let you determine the conditions under which Windows PowerShell loads configuration files and runs scripts.

You can set an execution policy for the local computer, for the current user, or for a particular session. You can also use a Group Policy setting to set execution policy for computers and users.

Source: Microsoft Documentation

6
  • 1
    Not quite right. [System.IO.Directory]::GetCurrentDirectory() does not represent powershell's current location, but rather the process working directory, which are not always the same. Replace with Get-Location
    – zdan
    Jul 9, 2012 at 20:57
  • +1, but I would use get-location instead of GetCurrentDirectory. Remember that PowerShell does not always mean the file system. Using the registry snap-in, I could use cd hkcu: and now the prompt would be totally off.
    – vcsjones
    Jul 9, 2012 at 20:58
  • @Synetech It's buried quite deep in the formatting help :\
    – Bob
    Jul 9, 2012 at 21:19
  • 3
    You can also use $PWD instead of calling Get-Location. E.g. function prompt { (Split-Path -Leaf $pwd) + '> ' }
    – Joey
    Nov 6, 2013 at 11:43
  • 1
    You don't have to define prompt in your profile file. It just has to be in the global session scope. The default seems equivalent to function prompt {"PS " + (Get-Location) + ">"}, while function prompt {""} gives the same as function prompt {"PS>"}. Use function prompt {" `b"} to get an empty prompt (at least visually...).
    – masterxilo
    Dec 17, 2017 at 10:31
17

Change the prompt to show current folder without full path and greater than symbol at the end:

One way could be:

Function Prompt { "$( ( get-item $pwd ).Name )>" }

Or:

Function Prompt { "$( Split-Path -leaf -path (Get-Location) )>" }

Or:

Function Prompt { "$( ( Get-Location | Get-Item ).Name )>" }
3
  • 4
    The first and third are better than the accepted answer in that they work for network folders. Split-Path won't function correctly on a path like \\myserver\my\path.
    – Chris
    Oct 14, 2019 at 13:32
  • And if I wanted to go back to before? How can I revert these?
    – Patrick
    Jul 27, 2020 at 19:24
  • It depends on what you had before. If you want to show the path and then the "greater than" symbol, use something like this: Function Prompt { "$pwd>" }
    – Jelgab
    Aug 11, 2020 at 12:04
11

As an additional note, I couldn't do Synetech's command until I first created the $profile.

  1. Open PowerShell

  2. Type $profile and hit enter. This will display the profile path PowerShell relies on, even if it doesn't exist (it didn't for me). My path was different than what Synetech posted.

     >$profile
     C:\Users\[username]\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
    
  3. I had to create both the WindowsPowerShell folder and the Microsoft.PowerShell_profile.ps1 file.

  4. Add Synetech's code and restart PowerShell.

Note:

If you're using posh-git (which is installed when using GitHub desktop), Synetech's script will override the posh-git prompt. Additional prompt scripts for posh-git here.

4
  • 2
    It's the same. %userprofile% expands to C:\Users\[username]
    – DavidPostill
    Mar 15, 2017 at 15:39
  • @DavidPostill that was my understanding, but my PowerShell didn't recognize %userprofile% as a directory. I don't believe my PowerShell is customized yet to recognize those paths, perhaps due to network settings? Mar 15, 2017 at 15:56
  • 2
    The syntax is different in PowerShell: $Env:userprofile is equivalent to echo %userprofile%
    – DavidPostill
    Mar 15, 2017 at 16:37
  • $profile has a different value in ISE vs. the regular prompt, you may have to create 2 files.
    – Chris
    Oct 14, 2019 at 13:36
5

I found this was pretty easy - combining Synetech's answer and the information found at PowerShell profiles. Because I am a newbie to PowerShell. My steps (for Visual Studio Code):

  1. test-path $profile (in the PowerShell command prompt - is there a profile set up?)

  2. new-item -path $profile -itemtype file -force (assuming the answer to the above is false)

  3. notepad $profile (opens Notepad)

  4. Paste in

     function prompt {
       $p = Split-Path -leaf -path (Get-Location)
       "$p> "
     }
    
  5. Save (you shouldn't have to chose a location; it is already done for you)

  6. Reload Visual Studio Code - you will probably get a message about running scripts (or just do next step before reload)

  7. Set-ExecutionPolicy RemoteSigned -Scope CurrentUser (at your PowerShell prompt, from the Super User answer)

  8. Reload Visual Studio Code

So it is mostly Synetech's answer with a bit to get started easily - especially step 2 makes this very easy.

1
  • Very easy steps to follow
    – chantey
    Nov 13, 2022 at 18:03
3

I wanted a more elaborate prompt and constructed a new prompt. This answer is not meant to replace the current answer, but more as an addition for those who stumble upon this later. This prompt will have full support over network paths and looks very elegant.

function Prompt
{
    write-host "PS " -ForegroundColor Magenta -NoNewline
    write-host (get-date -Format "yyyy-MM-dd HH:mm:ss") -ForegroundColor Yellow -NoNewline
    write-host " | " -ForegroundColor DarkGray -NoNewline
    write-host "\\$env:COMPUTERNAME " -NoNewline
    write-host " | " -ForegroundColor DarkGray -NoNewline
    if( (Get-Location).Drive -ne $null)
    {
        write-host (Get-Location) 
        $networkdrive = $false
    }
    else
    {
        $networkdrive = $true
        $first, $second, $third, $folder = (Get-Location).path.Split("\")
        write-host "\" -NoNewline
        $folder | foreach-object {
            write-host "\$_" -NoNewline
        }
        write-host
    }
    write-host "PS " -ForegroundColor Magenta -NoNewline
    if( (Get-Location).Drive -ne $null)
    {
        write-host "$((Get-Location).Drive):\"  -NoNewline
    }
    else
    {
        write-host "\\$((Get-Location).path.Split("\")[3])\"  -NoNewline
    }

    if( (Get-Location).path.Split("\").Count -gt 2 -and $networkdrive -eq $false)
    {
        write-host "…\"  -NoNewline
    }
    if( (Get-Location).path.Split("\").Count -gt 5 -and $networkdrive -eq $true)
    {
        write-host "…\"  -NoNewline
    }    write-host "$((Get-Location).path.Split("\")[-1])"  -NoNewline
    write-host ">" -NoNewline
    return " "
}

It will show a prompt like this:

PS 2021-03-24 02:03:39 | \\MYPC  | \\Server\Share\Folder1\Folder2
PS \\Server\…\Folder2> cd c:\Users\User
PS 2021-03-24 02:03:39 | \\MYPC  | C:\Users\User
PS C:\…\User>
1

The below single line works fine for me:

(Get-Location | Get-Item).Name
2
  • that wasn't the question - see above correct answer from Jelgab
    – hfrmobile
    Oct 8, 2018 at 12:01
  • This is a good way for one instance via powershell prompt
    – Zimba
    Mar 17, 2020 at 14:03
1

For posh-git the best way I've found is to customize the $GitPromptSettings.DefaultPromptPath.Text property.

In the profile:

    $GitPromptSettings.DefaultPromptPath.Text = '$(Split-Path -leaf -path ($ExecutionContext.SessionState.Path.CurrentLocation))'

Results in this (can't embed images yet, seemingly):

posh-git prompt showing only current directory

1

I created this neat prompt to that shows the drive and last folder.

For you example it would render as

PS C:\Users\b.HQ\Desktop\tsdev\my_folder>

as

PS C:\...\my_folder>

The prompt function is:

function prompt {"PS " + (get-location).drive.name+":\...\"+ $( ( get-item $pwd ).Name ) +">"}
1
  • copy/paste/execute and go on with life, thanks
    – mf_
    Mar 31, 2023 at 9:24
0

If you are using anaconda then you probably want to change your profile function to

function Prompt {
    $p = Split-Path -leaf -path (Get-Location)
    "$env:CONDA_PROMPT_MODIFIER $p> "
}

Although I think that just splitting on the last path component is a bit too much. The problem that I'm trying to solve is paths that take up an entire line (actually quite common in a codebase)

function Prompt {
    $maxLength = 50
    $p = (Get-Location).Path
    if ($p.Length -gt $maxLength) {
        $s = Split-Path -leaf -path (Get-Location)
        if ($s.Length -gt $maxLength - 1) {
            $p = $s
        }
        else {
            $p = "...$($p.Substring($p.Length - $maxLength + 3))"
        }
    }

    "$env:CONDA_PROMPT_MODIFIER $p> "
}

You can ditch the $env:CONDA_PROMPT_MODIFIER if you don't use Anaconda

0

I write a function that provides three styles {None, Name, Fulllpath} so you can easily change the prompt anytime.

<#
.Description
    It can simplify the prompt, so if your path is too long still okay.
    Implement: You are only to modify the "Prompt" function then done.
.Parameter style
    You can use tab to select the style.

    - None: do not show any text except ">" (this is default options)
    - Name: show the basename only
    - Fullpath: show the full path
.Outputs
    The output type is "string" so you must use "Invoke-Expression" to make it effective.
.Example
    Set-Prompt | iex
    Set-Prompt | Invoke-Expression
.Example
    Set-Prompt -style Name | iex
    Set-Prompt -style Fullpath | iex
.Example
    Set-Prompt -Verbose
#>
function Set-Prompt {
    param (
        [Parameter()]
        [ValidateSet('None', 'Name', 'Fullpath')]
        [string]$style = "None"
    )

    [string]$myPromptFunc = ""

    switch ($style) {
        "None" {
            $myPromptFunc = 'function Prompt { ">" }'
        }
        "Name" {
            $myPromptFunc = @"
    function Prompt {
        "`$((Get-Item `$pwd).Name)>"
    }
"@
        }
        "Fullpath" {
            $myPromptFunc = 'function Prompt { Write-Output "$($pwd.Path)>" }'
        }
    }

    if ($VerbosePreference -eq "Continue") {
        Write-Host "Call " -NoNewLine
        Write-Host 'Set-Prompt | Invoke-Expression' -ForegroundColor Yellow -NoNewLine
        Write-Host " to apply."

        Write-Host "The prompt function will be changed as follow" -ForegroundColor Green
    }
    Write-Output $myPromptFunc
}

demo

# Example1 default: None
PS C:\Windows\System32> Set-Prompt | iex
>

# Example1 Name
PS C:\Windows\System32> Set-Prompt -style Name | iex
System32>cd ..
Windows>

# Example3 fullpath
PS C:\Windows\System32> Set-Prompt -style Fullpath | iex
C:\Windows\System32>cd ..
C:\Windows>

You don't have to copy-paste every time. You can create a source directory try to search psd1, psm1 and then add the path to PSModulePath, and you can use it directly next time.

for powershell5, you may need to Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -F before you use the command.

For PowerShell 7, you can use it directly.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .