Дещо про оптимізацію терміналу powershell.

powershell logo
Останнім часом більше доводиться працювати з Windows і тому дозрів нарешті до оптимізації терміналу, щоб з убогості повної зробити щось що хоч більш-менш пристойно виглядає і дає хоч якусь мінімально прийнятну візуалізацію при хоч якійсь автоматизації. Вцілому жити без додаткових костилів від Sysinternals та без Cygwin все ще важко, але вже можна зліпити щось мінімально прийнятне.
Отже основні моменти:

  1. Кольори;
  2. Псевдоніми;
  3. grep і таке інше з Cygwin;
  4. Prompt;
  5. Усяке.

Базові відомості

Для powershell аналог .bashrc це такі файли:

  • $PSHOME\Profile.ps1 - для всіх користувачів, для всіх вузлів;
  • $PSHOME\Microsoft.PowerShell_profile.ps1 - для всіх користувачів, тільки для консолі;
  • $PsHome\Microsoft.PowerShellISE_profile.ps1 - для всіх користувачів, тільки для ISE;
  • $HOME\Documents\PowerShell\Profile.ps1 - для даного користувача, для всіх вузлів;
  • $HOME\Documents\PowerShell\Microsoft.PowerShell_profile.ps1 - для даного користувача, тільки для консолі;
  • $HOME\Documents\PowerShell\Microsoft.PowerShellISE_profile.ps1 - для даного користувача, тільки для ISE;

Крім того кожен новий вузол, наприклад Visual Studio Code буде мати свої профілі типу:

  • $PSHOME\Microsoft.VSCode_profile.ps1
  • $HOME\Documents\PowerShell\Microsoft.VSCode_profile.ps1

Не ускладнювати… Ні, не чули :) Далі розглядаю виключно налаштування спільного профілю для консолі та ISE для конкретного користувача.
У найпростішому випадку структура директорії $HOME\Documents\PowerShell буде така:

C:.
│   profile.ps1
│
└───Modules
    ├───Get-ChildItemColor
    │       FileInfo.ps1
    │       Get-ChildItemColor.psd1
    │       Get-ChildItemColor.psm1
    │       Get-ChildItemColorTable.ps1
    │       MatchInfo.ps1
    │       ProcessInfo.ps1
    │       PSColorHelper.ps1
    │       ServiceController.ps1
    │
    ├───Get-ConsoleColors
    │       Get-ConsoleColors.ps1
    │       Get-ConsoleColors.psm1
    │
    └───Prompt
            Prompt.ps1
            Prompt.psm1

profile.ps1 - наш профіль, Modules - директорія з додатковими модулями які ми використовуємо.

Модулі в профілі підключається так:

###COLORIZE FILE TYPES
Import-Module Get-ChildItemColor
$GetChildItemColorTable.File['Directory'] = "Magenta"

###VIEW COLORS
Import-Module Get-ConsoleColors

###CUSTOM PROMPT
Import-Module Prompt

Кольори

Отже, для початку дами, а потім і блек-джек. Можна придумувати свій велосипед, а можна взяти вже готовий з github.
По даному набору скриптів маю 1 зауваження. Довелося закоментувати у файлі Get-ChildItemColor.psm1 секцію

elseif($_ -is [System.ServiceProcess.ServiceController])
{
    ServiceController $_
    $_ = $null
}

бо десь на середині букви P валився кольоровий аплет get-service. Windows 10 Enterprise LTSC 1809, на інших не перевіряв.

Також використовую допоміжний модуль Get-ConsoleColors, для візуалізації доступних кольорів.

Псевдоніми

Alias… Вони ніби і є, але аби все було просто і логічно то це були б не Microsoft. Тому вони, за великим рахунком, існують тільки для заміни страшних конструкцій типу Clear-Content на старі добрі cls і т.п. Псевдонім типу alias ls='ls -l' створити не можна… Ну і нафіг би були потрібні такі аліаси, аби не один костиль. Щоб створити “складний” псевдонім, потрібно створити функцію, а потім створити псевдонім для неї. Наприклад, псевдонім jkl що запускає сервер jekyll буде представляти собою наступну конструкцію:

#Jekyll
Function runjkl {jekyll serve --watch --source "d:/github/nyurch.github.io" --destination "d:/github/nyurch.github.io/_site"}
Set-alias -name jkl -value runjkl

Аналогічно псевдонім для швидкого переходу в робочу директорію:

#Work folder
Function workcd {cd e:\install}
Set-alias -name temp -value workcd

grep

Досить очевидне рішення - додати із Cygwin через псевдонім

Set-alias grep c:\Cygwin64\bin\grep.exe

Аналогічно будь-яку іншу необхідну команду.

Prompt

Трохи функціоналу prompt-у. Пишемо скрипт, зберігаємо як psm1, кладемо в папку Modeles і підключаємо в профілі.

Результатом може бути powershell-термінал такого виду: PowerShell

Ще не tilda і навіть не gnome-terminal, але вже веселіше.

Не вистачає закладок…

Усяке

Тепер трохи із категорії “вік живи - вік учись”.
Знаходимо ярлик на програму, чи створюємо якщо його нема, відкриваємо його властивості і прописуємо гарячі клавіші.

PowerShell

Тепер наш термінал запускається стандартним поєднанням Ctrl+Alt+T.

prompt.psm1

function Prompt {
    #Assign Windows Title Text
    $host.ui.RawUI.WindowTitle = "WELCOME BACK $env:Username!"

    #Configure current user, current folder and date outputs
    $CmdPromptCurrentFolder = Split-Path -Path $pwd -Leaf
    $CmdPromptUser = [Security.Principal.WindowsIdentity]::GetCurrent();
    $Date = Get-Date -Format 'dddd dd/MM/yyyy HH:mm'

    # Test for Admin / Elevated
    $IsAdmin = (New-Object Security.Principal.WindowsPrincipal ([Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)

    #Decorate the CMD Prompt
    Write-Host ""
    Write-host ($(if ($IsAdmin) { 'Elevated ' } else { '' })) -BackgroundColor DarkRed -ForegroundColor White -NoNewline
    Write-Host " USER:$($CmdPromptUser.Name.split("\")[1]) " -BackgroundColor DarkBlue -ForegroundColor White -NoNewline
    Write-Host " $date " -ForegroundColor Yellow
    Write-Host " $pwd " -ForegroundColor Green
    return "> "
} #end prompt function

PowerShell Documentation.