Configure o Windows Powershell para exibir apenas o nome da pasta atual no prompt do shell

37

Estou usando o Powershell no Windows 7. Como configurar o Powershell para que ele exiba apenas o nome da pasta atual (em vez do caminho completo) no prompt do shell?

Por exemplo, em vez de C:\folder\directory\name>, eu quero name>.

Veera
fonte

Respostas:

57

Você precisa personalizar a função de prompt no seu perfil do PowerShell ( %userprofile%\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1); pode estar em branco ou até não existir se você nunca o modificou antes.

  1. Abra seu perfil (por exemplo, abra o arquivo mencionado anteriormente ou enquanto estiver no PowerShell Notepad $profile)

  2. Adicione o seguinte ao seu perfil:

    function prompt {
      $p = Split-Path -leaf -path (Get-Location)
      "$p> "
    }
    
  3. Salve o perfil

  4. Reinicie o PowerShell

    Opcional . Se você receber uma mensagem informando que não tem permissão para executar scripts, copie / cole esta linha no PowerShell:

    Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
    

    e reinicie.

As políticas de execução do Windows PowerShell permitem determinar as condições sob as quais o Windows PowerShell carrega arquivos de configuração e executa scripts.

Você pode definir uma política de execução para o computador local, para o usuário atual ou para uma sessão específica. Você também pode usar uma configuração de Diretiva de Grupo para definir a diretiva de execução para computadores e usuários.

Fonte: Documentação da Microsoft

Synetech
fonte
1
Não muito certo. [System.IO.Directory]::GetCurrentDirectory()não representa a localização atual do PowerShell, mas o diretório de trabalho do processo, que nem sempre é o mesmo. Substitua porGet-Location
zdan
+1, mas eu usaria get-location em vez de GetCurrentDirectory. Lembre-se de que o PowerShell nem sempre significa o sistema de arquivos. Usando o snap-in do registro, eu poderia usar cd hkcu:e agora o prompt seria totalmente desativado.
Vcsjones
@Synetech É enterrado bastante profunda na ajuda formatação: \
Bob
1
Você também pode usar em $PWDvez de ligar Get-Location. Por exemplofunction prompt { (Split-Path -Leaf $pwd) + '> ' }
Joey
1
Você não precisa definir promptno seu arquivo de perfil. Só precisa estar no escopo da sessão global. O padrão parece equivalente a function prompt {"PS " + (Get-Location) + ">"}, enquanto function prompt {""}dá o mesmo que function prompt {"PS>"}. Use function prompt {" `b"}para obter um prompt vazio (pelo menos visualmente ...).
Masterdilo
5

Como uma observação adicional, eu não poderia executar o comando @ Synetech até criar o perfil $.

  1. Abra o PowerShell
  2. Digite $profilee pressione enter. Isso exibirá o caminho do perfil em que o PowerShell depende, mesmo que não exista (não existia para mim). Meu caminho foi diferente do que o @Synetech postou acima.

    >$profile
    C:\Users\[username]\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
    
  3. Eu tive que criar a pasta WindowsPowerShell e o arquivo Microsoft.PowerShell_profile.ps1.

  4. Adicione o código da @ Synetech e reinicie o PowerShell.

Nota:

Se você estiver usando o posh-git (que é instalado ao usar a área de trabalho do GitHub), o script do @ Synetech substituirá o prompt do posh-git. Scripts de prompt adicionais para posh-git aqui .

Bryan
fonte
1
É o mesmo. %userprofile%expande paraC:\Users\[username]
DavidPostill
@ David David Postill, como eu entendi, mas meu PowerShell não reconheceu% userprofile% como um diretório. Não acredito que meu PowerShell ainda esteja personalizado para reconhecer esses caminhos, talvez devido às configurações de rede?
Bryan
2
A sintaxe é diferente no PowerShell: $Env:userprofileé equivalente aecho %userprofile%
DavidPostill
$ profile tem um valor diferente no ISE vs. o prompt regular, pode ser necessário criar 2 arquivos.
Chris
3

Altere o prompt para mostrar a pasta atual sem o caminho completo e maior que o símbolo no final:

Uma maneira poderia ser:

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

Ou:

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

Ou:

Function Prompt { "$( ( Get-Location | Get-Item ).Name )>" }
Jelgab
fonte
O primeiro e o terceiro são melhores que a resposta aceita, pois trabalham para pastas de rede. O Split-Path não funcionará corretamente em um caminho como \\myserver\my\path.
Chris
2

Achei isso muito fácil - combinando a resposta da @ Synetech e as informações encontradas nos perfis do PowerShell . Porque eu sou um novato no PS. Minhas etapas (para vscode):

  1. test-path $ profile (no prompt de comando do PS - existe um perfil configurado?)
  2. new-item -path $ profile -itemtype file -force (assumindo que a resposta acima seja falsa)
  3. notepad $ profile (abre o bloco de notas)
  4. colar em

    function prompt {
      $p = Split-Path -leaf -path (Get-Location)
      "$p> "
    }
    
  5. salvar (você não precisa escolher um local, ele já está pronto para você)
  6. reload vscode - você provavelmente receberá uma mensagem sobre a execução de scripts (ou apenas execute o próximo passo antes de recarregar)
  7. Set-ExecutionPolicy RemoteSigned -Scope CurrentUser (no prompt do PS, na resposta SuperUse)

  8. recarregar vscode

Portanto, na maioria das vezes, a resposta da @ Synetech (votada) com um pouco para começar com facilidade - especialmente a etapa 2 torna isso muito fácil.

Marca
fonte
0

A linha única abaixo funciona bem para mim

(Get-Location | Get-Item) .Name

Cannon Earnest
fonte
que não era a questão - ver acima resposta correta a partir Jelgab
hfrmobile