Windows Terminal: Jak zainstalować oh-my-posh?

Windows Terminal jest już z nami od dawna, ta nowoczesna aplikacja opracowana przez Microsoft, umożliwia uruchamianie różnych rodzajów powłok (shelli) i interfejsów wiersza poleceń.
Windows Terminal oferuje obsługę takich narzędzi jak: Windows PowerShell, PowerShell, wiersz poleceń (CMD) czy dystrybucje Linuksa (WSL).
Jednak potęga tej aplikacji tkwi w możliwośćiach jej konfiguracji i dostosowania. Zarówno skróty, zakładki (karty) czy wygląd można dostosować dla siebie i to nie zależnie czy jesteś programistą, administratorem czy bardziej zaawansowanym użytkownikiem.
Najlepszym narzędziem służącym do personalizacj prompta w Windows Terminal jest aplikacja oh-my-posh.
Jak zainstalować oh-my-posh w Windows Terminal? W jaki sposób dodać oh-my-possh do PowerShell?


oh-my-posh to aplikacja do personalizacji i ulepszania wyglądu terminala poprzez dodawanie zaawansowanych, konfigurowalnych promptów (wyświetlanych linii w wierszu poleceń). Działa z popularnymi powłokami, takimi jak PowerShell, bash, zsh, i jest kompatybilna z różnymi terminalami, w tym z naszym Windows Terminal.

Konfiguracja „całości” polega na instalacji czcionki która obsłguje dodatkowe znaki używane przez prompt, instalacji samej aplikacji oh-my-posh, zmianie ustawień aplikacji obsługującej wiersz poleceń oraz konfiguracji profilu używaneje przez nas powłoki.

W naszym wypadku będzie to powłoka PowerShell w wersji 7 i Windows Terminal.

Zaczynamy od czcionki, oh-my-posh zaleca jedną z czionek znajdującą się pakiecie NerdFonts, w naszym wypadku będzie to: Cascadia Cove NF Czcionki pobieramy bezpośrednio ze strony NerdFonts

https://www.nerdfonts.com/font-downloads

Pobrane czcionki rozpakowujemy i instalujemy w naszym systemie operacyjnym:

Możemy to zrobić używając do tego celu poniższego skryptu PowerShell. UWAGA w przypadku instalacji czcionki z poziomu wiersza poleceń, nie wystarczy jej skopiować do katalogu C:\Windows\Fonts – należy również dodać stosowny wpis do rejestru – szczegóły w poniższym skrypcie:

#font pack URL
$fontsurl = "https://github.com/ryanoasis/nerd-fonts/releases/download/v3.2.1/CascadiaCode.zip"

#creating a temporary folder for fonts
New-Item -Name tmpfonts -Path $env:TEMP -ItemType Directory

#font pack download
$file = $env:TEMP + "\tmpfonts\font.zip"
Invoke-WebRequest $url -OutFile $file

#font copy and register
$fontspath = $env:SystemRoot + "\Fonts"
Expand-Archive -Path $file -DestinationPath $($env:Temp + "\tmpfonts") -Force
Copy-Item "$($env:Temp+ "\tmpfonts")\CaskaydiaCoveNerdFont-Regular.ttf" -Destination $fontspath -Force
New-ItemProperty -Name "CaskaydiaCove NF" -Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Fonts" -PropertyType string -Value "CaskaydiaCoveNerdFont-Regular.ttf"

Kolejnym krokiem jest instalacja niezbędnych aplikacji. Sam Windows Terminal jest dostepny domyślnie w Windows 11 i Windows Server 2025 ale gdy macie starsze wersje jego instalacje opisaliśmy wcześniej.

W naszym przykładzie będziemy chcieli używać powłoki PowerShell 7 a ją należy wcześniej zainstalować ze sklepu Microsoft :

instalcji PS7 możemy również dokonać z użyciem wiersza poleceń. UWAGA: jest to jedyna opcja gdy Microsoft Store jest nie dostępny a jest tak w Windows Server 2025. Proces instalacj wykonujemy poleceniem winget

winget install --id Microsoft.Powershell --source winget

Kolejnym etapem jest instalacja aplikacji oh-my-psh ze sklepu Microsoft:

tutaj również możemy wykonać instalacje z poziomu Windows Terminala używając winget:

winget install --id JanDeDobbeleer.OhMyPosh --source winget


Następnie modyfikujemy ustawienia dotyczące czcionek w aplikacji Windows Terminal. Po jej uruchomieniu przechodzimy do ustawień i zmieniamy domyślną czcionkę w na zainstalowana wcześniej CaskaydiaCove NF

ten proces możemy równieże wykonać edytując sam plik ustawień Windows Terminal czyli settings.json, plik ten znajduje się w lokalziacji:

c\users\user\APPDATA\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json

        "defaults": 
        {
            "font": 
            {
                "face": "CaskaydiaCove NF"
            }
        },

Ostatnim krokiem konfiguracji jest modyfikacja ustawień profilu PowerShell oraz profilu Windows PowerShell tak aby przy starcie sesji uruchamiał aplikacje oh-my-posh. Modyfikacja polega na dodaniu do obu profili wpisu o treści:

oh-my-posh init pwsh --config ~/jandedobbeleer.omp.json | Invoke-Expression

a profile obu wersji PowerShell znajdują się w poniższych ścieżkach. Uwaga: jeżeli pliki nie istnieją należy je utworzyć:

C:\Users\user\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
C:\Users\user\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1


Mamy zainstalowaną czcionkę, mamy PowerShell’a 7 i zainstalowaliśmy również oh-my-posh. W ustawieniach Windows Terminal zmieniliśmy czcionkę domyślną na nową, wyedytowaliśmy również nasze profile PowerShell.

Konfiguracje mam zatem gotową sprawdźmy jak wygląda nasz Windows Terminal uruchamiając go ponownie…

Nasz prompt w podstawowej konfiguracji oh-my-posh wskazuje użytkownika który uruchamia sesje, katalog w którym przebywamy, jest gotowy do obsługi github oraz informuje nas czy wcześniejsze polecenie wykonało się poprawnie.

Na tym jednak nie koniec przygody z oh-my-posh, ponieważ prompt można dalej konfigurować wskazując mu jedną z dostępnych na starcie skrórek. A samo pole do konfiguracji jest olbrzymie ponieważ parametry można edytować samodzielnie:

każdy znajdzie cośdla siebie a jeżeli chciałby mieć swoją własną wersje…..to już materiał na oddzielny wpis:


Co w przypadku gdybyśmy chcieli zautomatyzować cały proces konfiguracji? Tak, aby siadając do nowego środowiska automatycznie wykonać powyższe kroki i błyskawicznie przygotować Windows Terminal zgodnie ze swoimi przyzwyczajeniami.

Na to mamy oczywiście sprawdzony sposób – w postaci skryptu. Wszystkie powyższe kroki udało mi się zestawić w jeden skrypt instalacyjny. Skrypt ten umieszczony w zewnętrznym repozytorium i pozwala mi błyskawicznie przygotować nowy Windows Terminal do swoich przyzwyczajeń używając tylko internetu i zapamiętanego adresu.

Skrypt znajdziecie poniżej a jego aktualną wersje w moim repozytorium GitHub.

Skrypt wywołujem w nowym środowisku z użyciem polecenia Invoke-RestMethod odwołując się do repozytorium i zapisując go lokalnie. Nie musze go nawet kopiować! Następnie uruchamiamy, ze względu na edycje profilu PowerShell proponuje uruchomić go w ISE (tak ISE też ma swój profil ale go nie zmieniamy):

#Windows Terminal Oh My Posh and PowerShell 7 install by sprawdzone.it
# full automate configure Oh My Posh on Windows Terminal

# 1. download and install font
# 2. install PowerShell 7
# 3. install oh my posh 
# 4. update Windows PowerShell and PowerShell 7 profiles
# 5. update settings file



#region font

Clear-Host
Write-Host "Installing font"

#font pack URL
$fontsurl = "https://github.com/ryanoasis/nerd-fonts/releases/download/v3.2.1/CascadiaCode.zip"

#creating a temporary folder for fonts
New-Item -Name tmpfonts -Path $env:TEMP -ItemType Directory

#font pack download
$file = $env:TEMP + "\tmpfonts\font.zip"
Invoke-WebRequest $fontsurl -OutFile $file

#font copy and register
$fontspath = $env:SystemRoot + "\Fonts"
Expand-Archive -Path $file -DestinationPath $($env:Temp + "\tmpfonts") -Force
Copy-Item "$($env:Temp+ "\tmpfonts")\CaskaydiaCoveNerdFont-Regular.ttf" -Destination $fontspath -Force
New-ItemProperty -Name "CaskaydiaCove NF" -Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Fonts" -PropertyType string -Value "CaskaydiaCoveNerdFont-Regular.ttf"

#cleaning after font pack
Remove-Item -Path $($env:Temp + "\tmpfonts") -Recurse -Force

#endregion


#region app
Clear-Host 
Write-Host "Installing apps"
$id = "Microsoft.Powershell"
winget list -q $id --source winget  | Out-Null 
if ($?) {
    Write-Host "$id is installed."
} 
else {
    Write-Host "Installing $id"
    winget install --id $id --silent --accept-source-agreements --accept-package-agreements --source winget
}

Clear-Host
$id = $null

$id = "JanDeDobbeleer.OhMyPosh"
winget list -q $id --source winget  | Out-Null 
if ($?) {
    Write-Host "$id is installed."
} 
else {
    Write-Host "Installing $id"
    winget install --id $id --silent --accept-source-agreements --accept-package-agreements --source winget
}

#endregion


#region profile
Clear-Host
Write-Host "Updating PWSH and PS profile"

#required command in profile for oh-my-posh
$profileline = "oh-my-posh init pwsh --config ~/jandedobbeleer.omp.json | Invoke-Expression"

#paths for profiles
$pwshprofile = $($home + "\Documents\PowerShell\Microsoft.PowerShell_profile.ps1")
$psprofile = $($home + "\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1")
$pwsh = Test-Path -Path $pwshprofile
$ps = Test-Path -Path $psprofile

#adding command into pwsh profile
if (! $pwsh) {
    New-Item -path $pwshprofile -type File -force
    Add-Content -Path $pwshprofile -Value $profileline
}
else
{ Add-Content -Path $pwshprofile-Value $profileline }

#adding command into ps profile
if (! $ps) {
    New-Item -path $psprofile -type File -force
    Add-Content -Path $psprofile -Value $profileline
}
else
{ Add-Content -Path $psprofile-Value $profileline }

#endregion


#region WT settings file
Clear-Host
Write-Host "Updating Windows Terminal Settings"

#path for JSON settings file
$settingsfile = $env:USERPROFILE + "\APPDATA\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json"

$settings = Test-Path $settingsfile

#start terminal - to create settings file if not exist
if (! $settings) {
    #start terminal - to create settings file when not exist
    Write-Host "Restarting Windows Terminal"
    start wt.exe
    Start-Sleep 3
    Stop-Process -Name WindowsTerminal -Force
    Start-Sleep 3
}

Write-Host "Updating settings file"
#get conntent settings json file - connvert json -  add two key Font and Face - export to json
$settingsfile = $env:USERPROFILE + "\APPDATA\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json"
$json = Get-Content $settingsfile | ConvertFrom-Json 

#add font to default profile
$json.profiles.defaults | Add-Member -NotePropertyName font -NotePropertyValue ([PSCustomObject]@{face = "CaskaydiaCove NF" })

#set default profile to PWSH
$json.defaultProfile = "{574e775e-4f2a-5b96-ac1e-a2962a402336}"

#export to json config
$json | ConvertTo-Json -Depth 10 | Set-Content $settingsfile

#endregion

Clear-Host
Write-Host "Windows Terminal is ready"

Cały proces instalacji zajmuje max 2 minuty w zależności od prędkości łącza – możecie go zobaczyć poniżej:

Czy to już koniec? Wydaj się że nie macie sprawdzony sposób na w pełni automatyczne przygotowanie środowiska Windows terminal, zaczynacie przygodę z Oh My Posh a przed wami automatyzacja dodawania własnych kart czy nawet instalacja WSL


Jeżeli mój wpis Ci się spodobał, pomógł w pracy? Chcesz mnie wspierać? Postaw kawę! To dzięki waszemu wsparciu nie ma reklam! Poniżej kod QR do płatności który jest jednocześnie linkiem do PayPal możesz też wpłacić BLIK z użyciem Przelewy24.pl