【PowerShell】터미널의 타이틀 바에 풀 패스를 표시한다

무인 PowerShell의 경우는 $host.UI.RawUI.WindowTitle 로만 지정할 수 있습니다만, 콘솔 에뮬레이터의 Cmder 에는 또 하나의 궁리가 필요했습니다.

궁극적으로 아래와 같은 외형입니다.



코드



결론부터 말하면, 이전 기사 에서도 소개한 C# 의 SendMessage 를 사용합니다.

윈도우 핸들 얻기



(위의 기사에서 소개한 것과 동일합니다)
function Get-ConsoleWindowHandle {
    $p = Get-Process -Id $PID
    $i = 0
    while ($p.MainWindowHandle -eq 0) {
        if ($i++ -gt 10) {
            return $null
        }
        $p = $p.Parent
    }
    return $p.MainWindowHandle
}
$Global:CONSOLE_HWND = Get-ConsoleWindowHandle

C#에서 클래스 정의


if(-not ('PowerShell.Window' -as [type])) {
    Add-Type -Name Window -Namespace PowerShell -MemberDefinition @'
[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, string lParam);

public static void SetText(IntPtr hwnd, string text) {
    SendMessage(hwnd, 0x000C, 0, text);
}
'@

}
function Set-ConsoleWindowTitle {
    param (
        $title
    )
    $hwnd = $Global:CONSOLE_HWND
    if (-not $hwnd) {
        return
    }
    [PowerShell.Window]::SetText($hwnd, $title)
}


프롬프트에 통합


$PROFILE 내의 prompt 함수 내에서 호출하여 작업중인 디렉토리의 전체 경로를 표시합니다.

드디어 프롬프트의 색을 요일별로 바꾸고 있습니다. 재택근무가 계속되어도 요일 감각을 잃지 않게 된다…
function prompt {
    $table = @(
        <#日#> "DarkYellow",
        <#月#> "Blue",
        <#火#> "Magenta",
        <#水#> "Cyan",
        <#木#> "Green",
        <#金#> "Yellow",
        <#土#> "Gray"
    )
    $dailyColor = $table[[System.Convert]::toint32((Get-Date).DayOfWeek)]
    $leaf = $pwd.Path | Split-Path -Leaf
    Set-ConsoleWindowTitle -title $pwd.Path
    if ($pwd.Path | Split-Path -Parent) {
        Write-Host "~\" -BackgroundColor DarkGray -ForegroundColor White -NoNewline
    }
    Write-Host $leaf -BackgroundColor $dailyColor -ForegroundColor Black -NoNewline
    return "`n> "
}

좋은 웹페이지 즐겨찾기