Skonfiguruj Windows PowerShell, aby wyświetlał tylko nazwę bieżącego folderu w wierszu poleceń powłoki

37

Korzystam z programu Powershell w systemie Windows 7. Jak skonfigurować program Powershell, aby wyświetlał tylko nazwę bieżącego folderu (zamiast pełnej ścieżki) w wierszu polecenia powłoki?

Na przykład Zamiast tego C:\folder\directory\name>chcę name>.

Veera
źródło

Odpowiedzi:

57

Musisz dostosować funkcję pytania w swoim profilu PowerShell ( %userprofile%\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1); może być pusty lub nawet nie istnieć, jeśli nigdy go wcześniej nie modyfikowałeś.

  1. Otwórz swój profil (np. Otwórz wyżej wspomniany plik lub w PowerShell, Notepad $profile)

  2. Dodaj następujące elementy do swojego profilu:

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

  4. Uruchom ponownie PowerShell

    Opcjonalny . Jeśli pojawi się komunikat informujący, że nie wolno uruchamiać skryptów, musisz skopiować / wkleić ten wiersz w programie PowerShell:

    Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
    

    i uruchom ponownie.

Zasady wykonywania programu Windows PowerShell pozwalają określić warunki, w których program Windows PowerShell ładuje pliki konfiguracyjne i uruchamia skrypty.

Możesz ustawić zasady wykonywania dla komputera lokalnego, dla bieżącego użytkownika lub dla konkretnej sesji. Możesz także użyć ustawienia zasad grupy, aby ustawić zasady wykonywania dla komputerów i użytkowników.

Źródło: Dokumentacja Microsoft

Synetech
źródło
1
Nie do końca. [System.IO.Directory]::GetCurrentDirectory()nie reprezentuje bieżącej lokalizacji programu PowerShell, ale raczej katalog roboczy procesu, które nie zawsze są takie same. Zamień naGet-Location
zdan
+1, ale zamiast tego użyłbym get-location GetCurrentDirectory. Pamiętaj, że PowerShell nie zawsze oznacza system plików. Korzystając z przystawki rejestru, mogłem skorzystać, cd hkcu:a teraz monit byłby całkowicie wyłączony.
vcsjones
@ Synetech Jest głęboko ukryty w pomocy formatowania: \
Bob
1
Możesz także użyć $PWDzamiast dzwonić Get-Location. Np.function prompt { (Split-Path -Leaf $pwd) + '> ' }
Joey,
1
Nie musisz definiować promptw pliku profilu. Musi to być tylko globalny zakres sesji. Domyślnie wydaje się równoważne function prompt {"PS " + (Get-Location) + ">"}, a function prompt {""}daje to samo co function prompt {"PS>"}. Użyj, function prompt {" `b"}aby uzyskać pusty monit (przynajmniej wizualnie ...).
masterxilo,
5

Dodatkowo, nie mogłem wykonać polecenia @ Synetech, dopóki nie utworzyłem profilu $.

  1. Otwórz PowerShell
  2. Wpisz $profilei naciśnij Enter. Spowoduje to wyświetlenie ścieżki profilu, na której opiera się PowerShell, nawet jeśli nie istnieje (nie dla mnie). Moja ścieżka była inna niż powyższa @Synetech.

    >$profile
    C:\Users\[username]\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
    
  3. Musiałem utworzyć zarówno folder WindowsPowerShell, jak i plik Microsoft.PowerShell_profile.ps1.

  4. Dodaj kod @ Synetech i uruchom ponownie PowerShell.

Uwaga:

Jeśli używasz posh-git (który jest instalowany podczas korzystania z pulpitu GitHub), skrypt @ Synetech zastąpi monit posh-git. Dodatkowe skrypty zachęty dla posh-git tutaj .

Bryan
źródło
1
To jest to samo. %userprofile%rozwija się doC:\Users\[username]
DavidPostill
@DavidPostill to było moje zrozumienie, ale mój PowerShell nie rozpoznał% userprofile% jako katalogu. Nie sądzę, że mój PowerShell jest jeszcze dostosowany do rozpoznawania tych ścieżek, być może z powodu ustawień sieciowych?
Bryan,
2
Składnia jest inna w PowerShell: $Env:userprofilejest odpowiednikiemecho %userprofile%
DavidPostill
Profil $ ma inną wartość w ISE niż zwykły monit, może być konieczne utworzenie 2 plików.
Chris
3

Zmień monit, aby wyświetlić bieżący folder bez pełnej ścieżki i większej niż symbol na końcu:

Jednym ze sposobów może być:

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

Lub:

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

Lub:

Function Prompt { "$( ( Get-Location | Get-Item ).Name )>" }
Jelgab
źródło
Pierwszy i trzeci są lepsze niż zaakceptowana odpowiedź, ponieważ działają dla folderów sieciowych. Podzielona ścieżka nie działa poprawnie na ścieżce takiej jak \\myserver\my\path.
Chris
2

Odkryłem, że było to dość łatwe - połączenie odpowiedzi @ Synetech i informacji znalezionych w profilach PowerShell . Ponieważ jestem nowicjuszem w PS. Moje kroki (dla vscode):

  1. test-path $ profile (w wierszu polecenia PS - czy jest ustawiony profil?)
  2. new-item -path $ profile -itemtype file -force (zakładając, że odpowiedź na powyższe jest fałszywa)
  3. notatnik $ profil (otwiera notatnik)
  4. wklej

    function prompt {
      $p = Split-Path -leaf -path (Get-Location)
      "$p> "
    }
    
  5. zapisz (nie powinieneś wybierać lokalizacji, jest to już zrobione)
  6. przeładuj vscode - prawdopodobnie otrzymasz komunikat o uruchomieniu skryptów (lub po prostu zrób kolejny krok przed przeładowaniem)
  7. Set-ExecutionPolicy RemoteSigned -Scope CurrentUser (na twój monit PS, z odpowiedzi SuperUse)

  8. przeładuj vscode

Więc głównie odpowiedź @ Synetech (poprawiona) z odrobiną łatwego rozpoczęcia - szczególnie krok 2 sprawia, że ​​jest to bardzo łatwe.

znak
źródło
0

Poniższa pojedyncza linia działa dla mnie dobrze

(Get-Location | Get-Item) .Name

Cannon Earnest
źródło
to nie było pytanie - patrz powyższa poprawna odpowiedź od Jelgab
hfrmobile