Останнім часом більше доводиться працювати з Windows і тому дозрів нарешті до оптимізації терміналу, щоб з убогості повної зробити щось що хоч більш-менш пристойно виглядає і дає хоч якусь мінімально прийнятну візуалізацію при хоч якійсь автоматизації. Вцілому жити без додаткових костилів від Sysinternals та без Cygwin все ще важко, але вже можна зліпити щось мінімально прийнятне.
Отже основні моменти:
Для powershell аналог .bashrc це такі файли:
Крім того кожен новий вузол, наприклад Visual Studio Code буде мати свої профілі типу:
Не ускладнювати… Ні, не чули :)
Далі розглядаю виключно налаштування спільного профілю для консолі та 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
Досить очевидне рішення - додати із Cygwin через псевдонім
Set-alias grep c:\Cygwin64\bin\grep.exe
Аналогічно будь-яку іншу необхідну команду.
Трохи функціоналу prompt-у. Пишемо скрипт, зберігаємо як psm1, кладемо в папку Modeles і підключаємо в профілі.
Результатом може бути powershell-термінал такого виду:
Ще не tilda і навіть не gnome-terminal, але вже веселіше.
Не вистачає закладок…
Тепер трохи із категорії “вік живи - вік учись”.
Знаходимо ярлик на програму, чи створюємо якщо його нема, відкриваємо його властивості і прописуємо гарячі клавіші.
Тепер наш термінал запускається стандартним поєднанням 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