Как изменить приглашение PowerShell, чтобы оно отображало только родительский каталог и текущий каталог? - PullRequest
3 голосов
/ 26 октября 2019

Я бы хотел сократить приглашение PowerShell, чтобы оно отображало только родительский каталог и текущий каталог. Например, если pwd равен

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

, я хочу, чтобы приглашение было:

PS ..\python-basics\Demos> 

. Я могу получить значение PS ..\Demos>, изменив функцию prompt() вфайл профиля:

  1. Найти местоположение файла профиля, запустив $profile в PowerShell.
  2. Открыть (или создать и открыть) файл профиля.
  3. Изменить (или добавьте) следующую prompt() функцию:

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

Я пытался использовать split() и отрицательное индексирование, но не смог заставить его работать.

Кроме того, я хочу сделать это, только если pwd как минимум на два уровня ниже. Если pwd - это что-то вроде C: \ folder \ folder, я хотел бы показать приглашение по умолчанию.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 27 октября 2019

Попробуйте следующую функцию, которая должна работать на Windows и Unix-подобных платформах (в PowerShell Core ), так:

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
}

Обратите внимание, что я выбрал один символ ( ГОРИЗОНТАЛЬНЫЙ ЭЛЛИПСИС, U+2026) для представления пропущенной части пути, поскольку .. можно спутать со ссылкой на каталог parent .

Примечание. Символ не-ASCII-диапазона распознается правильно только в том случае, если файл сценария, в который входит файл $PROFILE, либо сохранен как UTF-8 с спецификацией [1] или как UTF-16LE («Unicode»).

Если по какой-то причине это не работает, используйте три разных периода ('...' вместо '…')Однако обратите внимание, что это приведет к более длинной подсказке.


[1] Спецификация необходима только в Windows PowerShell ;PowerShell Core , напротив, использует UTF-8 по умолчанию, поэтому спецификация не требуется.

0 голосов
/ 27 октября 2019

Попробуйте это (слишком долго для комментария):

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 " "
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...