Настройте Windows Powershell для отображения только текущего имени папки в приглашении оболочки


37

Я использую Powershell в Windows 7. Как настроить Powershell, чтобы он отображал только текущее имя папки (а не полный путь) в приглашении оболочки?

Например, вместо C:\folder\directory\name>, я хочу name>.

Ответы:


57

Вы должны настроить функцию приглашения в своем профиле PowerShell ( %userprofile%\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1); он может быть пустым или даже не существовать, если вы никогда не изменяли его раньше.

  1. Откройте свой профиль (например, откройте вышеупомянутый файл или находясь в PowerShell, Notepad $profile)

  2. Добавьте следующее в свой профиль:

    function prompt {
      $p = Split-Path -leaf -path (Get-Location)
      "$p> "
    }
    
  3. Сохранить профиль

  4. Перезапустите PowerShell

    Необязательно . Если вы получили сообщение о том, что вам не разрешено запускать сценарии, вам нужно скопировать / вставить эту строку в PowerShell:

    Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
    

    и перезагрузите.

Политики выполнения Windows PowerShell позволяют определить условия, при которых Windows PowerShell загружает файлы конфигурации и запускает сценарии.

Вы можете установить политику выполнения для локального компьютера, для текущего пользователя или для определенного сеанса. Вы также можете использовать параметр групповой политики, чтобы установить политику выполнения для компьютеров и пользователей.

Источник: документация Microsoft


1
Не совсем верно. [System.IO.Directory]::GetCurrentDirectory()не представляет текущее местоположение powershell, а скорее рабочий каталог, который не всегда одинаков. Заменить наGet-Location
здан

+1, но я бы использовал get-location вместо GetCurrentDirectory. Помните, что PowerShell не всегда означает файловую систему. Используя оснастку реестра, я мог бы использовать, cd hkcu:и теперь подсказка будет полностью отключена.
vcsjones

@Synetech Это глубоко скрыто в справке по форматированию: \
Боб

1
Вы также можете использовать $PWDвместо звонка Get-Location. Напримерfunction prompt { (Split-Path -Leaf $pwd) + '> ' }
Джои

1
Вам не нужно определять promptв вашем профиле файла. Это просто должно быть в глобальной области сеанса. Значение по умолчанию эквивалентно function prompt {"PS " + (Get-Location) + ">"}, в то время как function prompt {""}дает то же самое, что и function prompt {"PS>"}. Используйте, function prompt {" `b"}чтобы получить пустую подсказку (хотя бы визуально ...).
masterxilo

5

Как дополнительное примечание, я не мог выполнить команду @ Synetech, пока я сначала не создал профиль $.

  1. Откройте PowerShell
  2. Введите $profileи нажмите ввод. Это покажет путь к профилю, на который опирается PowerShell, даже если он не существует (он не был для меня). Мой путь отличался от описанного выше @Synetech.

    >$profile
    C:\Users\[username]\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
    
  3. Мне пришлось создать папку WindowsPowerShell и файл Microsoft.PowerShell_profile.ps1.

  4. Добавьте код @ Synetech и перезапустите PowerShell.

Заметка:

Если вы используете posh-git (который устанавливается при использовании рабочего стола GitHub), скрипт @ Synetech переопределит приглашение posh-git. Дополнительные подсказки для скриптов пошалить можно здесь .


1
Это то же самое. %userprofile%расширяется доC:\Users\[username]
DavidPostill

@DavidPostill - это мое понимание, но мой PowerShell не распознал% userprofile% как каталог. Я не верю, что мой PowerShell настроен для распознавания этих путей, возможно, из-за сетевых настроек?
Брайан,

2
Синтаксис в PowerShell другой: $Env:userprofileэквивалентенecho %userprofile%
DavidPostill

$ profile имеет другое значение в ISE по сравнению с обычным приглашением, возможно, вам придется создать 2 файла.
Крис

3

Измените подсказку, чтобы показать текущую папку без полного пути и больше, чем символ в конце:

Одним из способов может быть:

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

Или:

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

Или:

Function Prompt { "$( ( Get-Location | Get-Item ).Name )>" }

Первый и третий лучше принятого ответа в том, что они работают для сетевых папок. Split-Path не будет работать правильно на пути, как \\myserver\my\path.
Крис

2

Я обнаружил, что это довольно легко - объединить ответ @ Synetech и информацию, найденную в профилях PowerShell . Потому что я новичок в PS. Мои шаги (для vscode):

  1. test-path $ profile (в командной строке PS - настроен ли профиль?)
  2. new-item -path $ profile -itemtype file -force (при условии, что ответ на вышеприведенный ответ ложный)
  3. Блокнот $ profile (открывает блокнот)
  4. вставить в

    function prompt {
      $p = Split-Path -leaf -path (Get-Location)
      "$p> "
    }
    
  5. сохранить (вам не нужно выбирать местоположение, оно уже сделано для вас)
  6. перезагрузите vscode - вы, вероятно, получите сообщение о запуске скриптов (или просто выполните следующий шаг перед перезагрузкой)
  7. Set-ExecutionPolicy RemoteSigned -Scope CurrentUser (по вашей подсказке PS, из ответа SuperUse)

  8. перезагрузить vscode

Так что, в основном, ответ @ Synetech (с голосованием) с небольшим количеством, чтобы начать легко - особенно шаг 2 делает это очень легко.


0

Ниже единственная строка отлично работает для меня

(Get-Location | Get-Item) .Name


это не был вопрос - см. выше правильный ответ от Jelgab
hfrmobile
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.