Вопрос или проблема
Я использую PowerShell на Windows 7. Как настроить PowerShell так, чтобы он отображал только имя текущей папки (вместо полного пути) в приглашении командной строки?
Например, вместо C:\folder\directory\name>
я хочу, чтобы было name>
.
Вам нужно настроить функцию приглашения в вашем профиле PowerShell (%userprofile%\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
); он может быть пустым или даже не существовать, если вы никогда не изменяли его ранее.
-
Откройте ваш профиль (например, откройте упомянутое выше файл или в PowerShell введите
Notepad $profile
) -
Добавьте следующее в ваш профиль:
function prompt { $p = Split-Path -leaf -path (Get-Location) "$p> " }
-
Сохраните профиль
-
Перезапустите 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.
-
Откройте PowerShell
-
Введите
$profile
и нажмите Enter. Это покажет путь к профилю, на который полагается PowerShell, даже если он не существует (он не существовал у меня). Мой путь отличался от того, что опубликовал Synetech.>$profile C:\Users\[username]\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
-
Мне пришлось создать как папку WindowsPowerShell, так и файл Microsoft.PowerShell_profile.ps1.
-
Добавьте код Synetech и перезапустите PowerShell.
Примечание:
Если вы используете posh-git (который устанавливается при использовании GitHub desktop), скрипт Synetech переопределит приглашение posh-git. Дополнительные скрипты для приглашения posh-git здесь.
Я нашел это довольно простым – сочетав ответ Synetech и информацию, найденную на профилях PowerShell. Поскольку я новичок в PowerShell, вот мои шаги (для Visual Studio Code):
-
test-path $profile
(в командной строке PowerShell – установлен ли профиль?) -
new-item -path $profile -itemtype file -force
(предполагая, что ответ на вышеуказанный вопрос – ложь) -
notepad $profile
(открывает Блокнот) -
Вставьте
function prompt { $p = Split-Path -leaf -path (Get-Location) "$p> " }
-
Сохраните (вам не нужно выбирать расположение; оно уже выбрано для вас)
-
Перезагрузите Visual Studio Code – вы, вероятно, получите сообщение о выполнении скриптов (или просто выполните следующий шаг перед перезагрузкой)
-
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
(в приглашении PowerShell, из ответа Super User) -
Перезагрузите 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. Вот пошаговая инструкция, как это сделать:
Шаги по настройке:
-
Откройте ваш профиль PowerShell:
Выполните команду в PowerShell, чтобы определить путь к вашему профилю:Notepad $profile
Если файла не существует, Notepad предложит вам его создать.
-
Добавьте функцию
prompt
:
В открывшемся файле профиля добавьте следующий код:function prompt { $p = Split-Path -leaf -path (Get-Location) "$p> " }
Эта функция извлекает имя текущей директории с помощью
Split-Path -leaf -path (Get-Location)
. -
Сохраните изменения:
Сохраните файл и закройте Notepad. -
Перезапустите 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 для отображения только имени текущей папки. Это изменение помогает избежать перегруженности информацией и делает использование командной строки более удобным. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью!