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

Вопрос или проблема

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

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

Вам нужно настроить функцию приглашения в вашем профиле 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

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

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

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

Или:

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

Или:

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

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

  1. Откройте PowerShell

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

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

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

Примечание:

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

Я нашел это довольно простым – сочетав ответ Synetech и информацию, найденную на профилях PowerShell. Поскольку я новичок в PowerShell, вот мои шаги (для Visual Studio Code):

  1. test-path $profile (в командной строке PowerShell – установлен ли профиль?)

  2. new-item -path $profile -itemtype file -force (предполагая, что ответ на вышеуказанный вопрос – ложь)

  3. notepad $profile (открывает Блокнот)

  4. Вставьте

     function prompt {
       $p = Split-Path -leaf -path (Get-Location)
       "$p> "
     }
    
  5. Сохраните (вам не нужно выбирать расположение; оно уже выбрано для вас)

  6. Перезагрузите Visual Studio Code – вы, вероятно, получите сообщение о выполнении скриптов (или просто выполните следующий шаг перед перезагрузкой)

  7. Set-ExecutionPolicy RemoteSigned -Scope CurrentUser (в приглашении PowerShell, из ответа Super User)

  8. Перезагрузите Visual Studio Code

Таким образом, это в основном ответ Synetech с небольшими дополнениями для легкого начала – особенно шаг 2 делает это очень простым.

Я хотел более подробное приглашение и создал новое приглашение. Этот ответ не предназначен для замены текущего ответа, а скорее как дополнение для тех, кто наткнется на это позже. Это приглашение поддерживает полные сетевые пути и выглядит очень элегантно.

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 " "
}

Он будет отображать приглашение, подобное этому:

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>

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

(Get-Location | Get-Item).Name

Для posh-git лучший способ, который я нашел – настроить $GitPromptSettings.DefaultPromptPath.Text свойство.

В профиле:

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

Результат таков (пока не могу вставить изображения, видимо):

posh-git приглашение, показывающее только текущую директорию

Я создал это аккуратное приглашение, которое показывает диск и последнюю папку.

Для вашего примера это будет выглядеть как

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

как

PS C:\...\my_folder>

Функция приглашения:

function prompt {"PS " + (get-location).drive.name+":\...\"+ $( ( get-item $pwd ).Name ) +">"}

Если вы используете anaconda, то вам, вероятно, захочется изменить функцию профиля на

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

Хотя я думаю, что просто разделять по последнему компоненту пути – это немного чересчур. Проблема, которую я пытаюсь решить, заключается в путях, которые занимают целую строку (что довольно распространено в кодовой базе)

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> "
}

Вы можете избавится от $env:CONDA_PROMPT_MODIFIER, если не используете Anaconda

Я написал функцию, которая предоставляет три стиля {None, Name, Fullpath}, чтобы вы могли легко изменять приглашение в любое время.

<#
.Description
    Это может упростить приглашение, так что если ваш путь слишком длинный, все равно все будет в порядке.
    Реализация: вам нужно просто изменить функцию "Prompt", и все готово.
.Parameter style
    Вы можете использовать табуляцию для выбора стиля.

    - None: не показывать никакой текст, кроме ">" (это опции по умолчанию)
    - Name: показывать только базовое имя
    - Fullpath: показывать полный путь
.Outputs
    Тип вывода - "строка", поэтому вам необходимо использовать "Invoke-Expression", чтобы он сработал.
.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 "Вызов " -NoNewLine
        Write-Host 'Set-Prompt | Invoke-Expression' -ForegroundColor Yellow -NoNewLine
        Write-Host " для применения."

        Write-Host "Функция приглашения будет изменена следующим образом" -ForegroundColor Green
    }
    Write-Output $myPromptFunc
}

демонстрация

# Пример1 по умолчанию: None
PS C:\Windows\System32> Set-Prompt | iex
>

# Пример2 Name
PS C:\Windows\System32> Set-Prompt -style Name | iex
System32>cd ..
Windows>

# Пример3 fullpath
PS C:\Windows\System32> Set-Prompt -style Fullpath | iex
C:\Windows\System32>cd ..
C:\Windows>

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

для powershell5 вам может потребоваться Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -F перед тем, как вы воспользуетесь командой.

Для PowerShell 7 вы можете использовать это напрямую.

в 2024 году функция ниже в вашем профиле PowerShell (>Notepad $profile) по-прежнему работает, и бонус: она также влияет на PowerShell внутри VS Code.

function prompt {
$p = Split-Path -leaf -path (Get-Location)
“$p> ”
}

Счастливого дня с Джереми

Ответ или решение

Для настройки PowerShell на Windows 7, чтобы он отображал только имя текущей папки в командной строке, вам нужно изменить функцию приглашения в вашем профиле PowerShell. Вот пошаговая инструкция, как это сделать:

Шаги по настройке:

  1. Откройте ваш профиль PowerShell:
    Выполните команду в PowerShell, чтобы определить путь к вашему профилю:

    Notepad $profile

    Если файла не существует, Notepad предложит вам его создать.

  2. Добавьте функцию prompt:
    В открывшемся файле профиля добавьте следующий код:

    function prompt {
       $p = Split-Path -leaf -path (Get-Location)
       "$p> "
    }

    Эта функция извлекает имя текущей директории с помощью Split-Path -leaf -path (Get-Location).

  3. Сохраните изменения:
    Сохраните файл и закройте Notepad.

  4. Перезапустите PowerShell:
    Закройте текущее окно PowerShell и запустите его снова, чтобы изменения вступили в силу.

Дополнительные настройки

Если после перезапуска PowerShell у вас появляется сообщение о том, что выполнение сценариев запрещено, это означает, что вам необходимо изменить политику выполнения. Выполните следующую команду:

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

Перезапустите PowerShell после этой команды.

Проверка работы

Теперь ваш PowerShell должен отображать только имя текущей папки, например:

name>

Дополнительные примеры

Вы можете использовать различные определения функции prompt, чтобы добиться того же эффекта. Например:

function prompt {
    "$(Get-Item $pwd).Name> "
}

или

function prompt {
    "$(Split-Path -leaf -path (Get-Location))> "
}

Вы можете выбрать любой из вышеуказанных вариантов, так как они дадут равнозначный результат.

Заключение

Теперь вы настроили PowerShell для отображения только имени текущей папки. Это изменение помогает избежать перегруженности информацией и делает использование командной строки более удобным. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью!

Оцените материал
Добавить комментарий

Капча загружается...