Windows PowerShell: zmiana wiersza polecenia

85

Jak za pomocą programu Windows PowerShell zmienić wiersz polecenia?

Na przykład domyślny monit mówi

PS C:\Documents and Settings\govendes\My Documents>

Chcę dostosować ten ciąg.

sashang
źródło

Odpowiedzi:

107

Po prostu umieść funkcję promptw swoim profilu PowerShell ( notepad $PROFILE), np:

function prompt {"PS: $(get-date)>"}

lub kolorowe:

function prompt
{
    Write-Host ("PS " + $(get-date) +">") -nonewline -foregroundcolor White
    return " "
}
Ocaso Protal
źródło
2
notepad $PROFILEnie działa w systemie Windows 7 z wiersza polecenia administratora programu PowerShell
jcollum,
18
Ahh, widzę, że najpierw musisz utworzyć profil:new-item -itemtype file -path $profile -force
jcollum
4
Uwaga: Możesz po prostu wkleić funkcję podpowiedzi w PowerShell, aby zmienić ścieżkę zachęty zamiast zapisywać funkcję w swoim profilu, ale będziesz musiał to robić za każdym razem, gdy uruchamiasz PowerShell.
Larry Battle
3
Musisz także uruchomić Powershell jako administrator i to zrobić Set-ExecutionPolicy RemoteSigned.
okazania
1
@qed, Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestrictedjeśli chcesz zmienić tylko dla bieżącego użytkownika lub nie możesz działać jako administrator.
cz
21

W związku z komentarzem do odpowiedzi Ocaso Protal , potrzebne są następujące elementy dla systemu Windows Server 2012, a także Windows 7 (w oknie PowerShell):

new-item -itemtype file -path $profile -force
notepad $PROFILE

Sugerowałbym następujące podpowiedź, jeśli uruchamiasz z wieloma nazwami użytkowników (np. Ty + login produkcyjny):

function Global:prompt {"PS [$Env:username]$PWD`n>"} 

(To zasługa Davida I. McIntosha).

Warren Stevens
źródło
1
Musisz także uruchomić Powershell jako administrator i to zrobić Set-ExecutionPolicy RemoteSigned.
okazania
11

Po monicie podoba mi się aktualna sygnatura czasowa i rozwiązane litery dysków dla dysków sieciowych. Aby było bardziej czytelne, umieściłem to w dwóch wierszach i trochę pobawiłem się kolorami.

Z CMD skończyłem z

PROMPT=$E[33m$D$T$H$H$H$S$E[37m$M$_$E[1m$P$G

W przypadku PowerShell otrzymałem ten sam wynik z:

function prompt {
    $dateTime = get-date -Format "dd.MM.yyyy HH:mm:ss"
    $currentDirectory = $(Get-Location)
    $UncRoot = $currentDirectory.Drive.DisplayRoot

    write-host "$dateTime" -NoNewline -ForegroundColor White
    write-host " $UncRoot" -ForegroundColor Gray
    # Convert-Path needed for pure UNC-locations
    write-host "PS $(Convert-Path $currentDirectory)>" -NoNewline -ForegroundColor Yellow
    return " "
}

Co jest trochę bardziej czytelne :-)

BTW:

  • Wolę powershell_ise.exe $PROFILEzamiast (głupiego) Notatnika .
  • Jeśli chcesz debugować swoją prompt () za pomocą punktów przerwania, powinieneś zmienić nazwę funkcji prompt na cokolwiek innego (lub wypróbować ją w innym pliku). W przeciwnym razie możesz skończyć w pętli: kiedy zatrzymasz debugowanie, ponownie wywoływana jest prompt () i ponownie zatrzymasz się w punkcie przerwania. Na początku dość irytujące ...
Trivia Coder
źródło
Właśnie tego szukałem!
Glen Little
8

Jeśli chcesz to zrobić sam, odpowiedz Ocaso Protal jest do zrobienia. Ale jeśli jesteś leniwy jak ja i po prostu chcesz coś zrobić za Ciebie, to bardzo polecam pakiet Pshazz Luke'a Sampsona .

Aby pokazać, jak bardzo możesz być leniwy, przedstawię krótki samouczek.

  • Zainstaluj Pshazz za pomocą Scoop ( scoop install pshazz)
  • Użyj ładnego, wstępnie zdefiniowanego motywu ( pshazz use msys)
  • Pij (korzenne) piwo

Pshazz umożliwia również tworzenie własnych motywów, co jest tak proste, jak konfiguracja pliku JSON. Zajrzyj do mojego, aby zobaczyć, jakie to proste!

Fomentia
źródło
7

Aby pokazać tylko literę dysku, której używam:

            function prompt {(get-location).drive.name+"\...>"}

Następnie, aby powrócić do ścieżki, której używam:

            function prompt {"$pwd>"}
Chris Horan
źródło
5

Ta wersja odpowiedzi Warrena Stevensa pozwala uniknąć hałaśliwego „Microsoft.PowerShell.Core \ FileSystem” na ścieżce dostępu Set-Locationdo udziałów sieciowych.

function prompt {"PS [$Env:username@$Env:computername]$($PWD.ProviderPath)`n> "} 
nudl
źródło