Содержание

Настройка ярлыка PowerShell

1. Поменять размер шрифта на 18 и выбрать фонт Lucida Console

2. В ярлыке запуска добавить -nologo

"C:\Users\administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell\Windows PowerShell.lnk"
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -nologo  

3. После запуска в Defaults поменять прозрачность на 90%

4. Размер 120 на 40 строк.

Профиль

ОписаниеПуть
Текущий пользователь - текущий хост$Home\[My ]Documents\PowerShell\Microsoft.PowerShell_profile.ps1 $profile
Текущий пользователь - все хосты$Home\[My ]Documents\PowerShell\Profile.ps1$profile.CurrentUserAllHosts
Все пользователи – Текущий хост$PSHOME\Microsoft.PowerShell_profile.ps1$profile.AllUsersCurrentHost
Все пользователи – Все хосты$PSHOME\Profile.ps1$profile.AllUsersAllHosts

Посмотреть все существующие файлы профиля

$profile| select *Host | fl
$Profile | Get-Member -MemberType NoteProperty

Создать профиль

if (!(test-path $PROFILE.CurrentUserAllHosts )){new-item $PROFILE.CurrentUserAllHosts  -type file -force};ise $PROFILE.CurrentUserAllHosts 

Настроить политику запуска

Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser -Force

Поменять заголовок окна на имя пользователя

$host.UI.RawUI.WindowTitle = $(whoami)

Модуль PSReadLine

Вся красота в консолии PowerShell делается с помощью модуля PSReadLine

Чтобы посмотреть все параметры у командлетов, можно после - нажать Ctrl+пробел и вы увидете списком все варианты.

Если пропадают русские буквы, то нужно переустановить модуль PSReadLine

  1. Remove-Module PSReadLine
  2. Закрыть консоль PowerShell и удалить папку C:\Program Files\WindowsPowerShell\Modules\PSReadLine
  3. Install-Module PSReadLine -Force -Scope CurrentUser -SkipPublisherCheck

или

добавить папку с версией 2.3.4 в папку C:\Program Files\WindowsPowerShell\Modules\PSReadLine

Поиск по истории, как в Bash

1. Запускаем

 ise $PROFILE

2. Добавляем в конец и сохраняем

Set-PSReadLineKeyHandler -Key UpArrow   -Function HistorySearchBackward
Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward

Раскрашиваем prompt в PowerShell

Идея в том, чтобы если PowerShell запущен в режиме админа, то приглашение было красным, а если не админом, то белым.

Шаг 1. Запустить консоль PowerShell. Если профиль PowerShell для пользователя не найден, то создать его, если найден, то открыть на редактирование. Вместо ise можно использовать notepad, например так notepad $profile

if (!(test-path $profile)){new-item $profile -type file -force};ise $profile

Шаг 2. Вписать следующий код и сохранить файл

if ($host.Name -eq 'ConsoleHost') {
$host.UI.RawUI.WindowTitle = $(whoami)  # Write curent user name in Powershell window tilte
 
function prompt {
 $MyESC          = "$([char]27)"
 $MyColorRed     = $MyESC + "[91m"
 $MyColorWhite   = $MyESC + "[97m"
 $MyColorMagenta = $MyESC + "[95m"
 $MyColorGreen   = $MyESC + "[92m"
 $MyRightArrow   = [char]0x2192
 $MyColorArrow   = $MyESC + "[38;5;214m"
 $MyLocation     = (Get-Location).Path
 
 if ($MyLocation.length -gt 30) {
 
        $MyLocation = $MyLocation.Substring(0,9)+"..."+$MyLocation.Substring(($MyLocation.length-20),20)
 }   
 
 
 [Security.Principal.WindowsPrincipal]$user = [Security.Principal.WindowsIdentity]::GetCurrent();
                 if($user.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)){
                 "$($MyColorRed)PS$MyColorMagenta[$MyColorGreen" + $MyLocation+"$MyColorMagenta]$MyColorArrow$MyRightArrow" +
                   $(if ($NestedPromptLevel -ge 1) { $MyRightArrow+'>' }) + "$MyColorWhite"
                 }
                 else{
                 "$($MyColorWhite)PS$MyColorMagenta[$MyColorGreen" + $MyLocation+"$MyColorMagenta]$MyColorArrow$MyRightArrow" +
 
                     $(if ($NestedPromptLevel -ge 1) { $MyRightArrow+'>' }) + "$MyColorWhite"
                 }
}
} else{
 
          "PS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) ";
}

Шаг 3. При запуске от имени админа приглашение будет красным, обычное - белым.

Код для просмотра ASCII кодов всех доступных цветов

Using ANSI Escape Sequences in PowerShell

$esc=$([char]27)
echo "`n$esc[1;4m256-Color Foreground & Background Charts$esc[0m"
foreach ($fgbg in 38,48) {  # foreground/background switch
  foreach ($color in 0..255) {  # color range
    #Display the colors
    $field = "$color".PadLeft(4)  # pad the chart boxes with spaces
    Write-Host -NoNewLine "$esc[$fgbg;5;${color}m$field $esc[0m"
    #Display 6 colors per line
    if ( (($color+1)%6) -eq 4 ) { echo "`r" }
  }
  echo `n
}

В данной строке меняется 31m от 0 до 255 для foreground color

    "$([char]27)[38;5;31m TestString"
    "$([char]27)[38;5;15m$([char]27)[48;5;33m ssss"  # белый текст 15 на голубом 33 фоне.
    "$([char]27)[38;5;15m$([char]27)[48;5;17m" # Вернуть стандартный цвет PowerShell 

256 цветов

Следующие коды указывают терминалу на использование заданного идентификатора цвета:

ESC Code SequenceОписание
ESC[38;5;{ID}mУстановить цвет текста.
ESC[48;5;{ID}mУстановить цвет фона.

Где {ID} следует заменить на индекс цвета от 0 до 255 из следующей таблицы цветов:

Примеры

Вставить в profile.ps1

$global:forePromptColor = 0
$global:leftArrow = [char]0xe0b2
$global:rightArrow = [char]0xe0b0
$global:esc = "$([char]27)"
$global:fore = "$esc[38;5"
$global:back = "$esc[48;5"
$global:prompt = ''
Get-ChildItem -Exclude *.xml $PSHOME | Format-Table Mode, @{
    Label = "Name"
    Expression =
    {
        switch ($_.Extension)
        {
            '.exe'    { $color = "93"; break }
            '.ps1xml' { $color = '32'; break }
            '.dll'    { $color = "35"; break }
            default   { $color = "0" }
        }
        $e = [char]27
       "$e[${color}m$($_.Name)${e}[0m"
    }
 }, Length
 
######### Process ################
 
Get-Process | Format-Table @{ Label = "PID"; Expression={$_.Id}},
        @{ Label = "Name"; Expression={$_.Name}},
        @{ Label = "RAM (MB)"; Expression={if($_.WS/1MB -gt 100){"$([char]27)[0;31m$([System.Math]::Round($_.WS/1MB, 1))$([char]27)[0m"}else{"$([char]27)[0;32m$([System.Math]::Round($_.WS/1MB, 1))$([char]27)[0m"}}},
        @{ Label = "Responding"; Expression={if($_.Responding -eq $true){"$([char]27)[0;32m$($_.Responding)$([char]27)[0m"}else{"$([char]27)[0;31m$($_.Responding)$([char]27)[0m"}}}

Ещё вариант

if ($host.Name -eq 'ConsoleHost' -or $host.Name -eq 'Visual Studio Code Host' ) {
 
  Import-Module PSReadline -RequiredVersion 2.2.0
  Set-PSReadLineOption -EditMode Windows
  Set-PSReadLineOption -PredictionSource History
 
  Set-PSReadlineOption -Color @{
    "Command"          = [ConsoleColor]::Green
    "Parameter"        = [ConsoleColor]::Gray
    "Operator"         = [ConsoleColor]::Magenta
    "Variable"         = [ConsoleColor]::Yellow
    "String"           = [ConsoleColor]::Yellow
    "Number"           = [ConsoleColor]::Yellow
    "Type"             = [ConsoleColor]::Cyan
    "Comment"          = [ConsoleColor]::DarkCyan
    "InlinePrediction" = '#70A99F'
  }
 
  Set-PSReadLineKeyHandler -Function AcceptSuggestion -Key 'Ctrl+Spacebar'
  Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward
  Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward 
 
  Set-PSReadLineKeyHandler -Key Ctrl+Shift+b `
                       -BriefDescription BuildCurrentDirectory `
                       -LongDescription "Build the current directory" `
                       -ScriptBlock {
    [Microsoft.PowerShell.PSConsoleReadLine]::RevertLine()
    [Microsoft.PowerShell.PSConsoleReadLine]::Insert("dotnet build")
    [Microsoft.PowerShell.PSConsoleReadLine]::AcceptLine()
  }
}

Выводим Эмодзи/Emoji

Powershell 7 и Terminal поддерживают Emoji с помощью `u{код эмодзи}

Windows Powershell верссии 5.1 не поддерживают символ Unicode escape `u и требуются дополнительные преобразования.

Возьмём шестнадцатиричный код символ смайлика U+1F600. В начале уберём U+ из начала строки и оставим Hex значение, затем 1F600 конвертируем из Hex в Int32. После, сконвертируем значение в UTF-16 строку.

$EmojiIcon = [System.Convert]::toInt32("1F600",16)
[System.Char]::ConvertFromUtf32($EmojiIcon)
 
# или 
$EmojiIcon = [System.Convert]::toInt32("1F600",16)
 Write-Host "The Operation Completed Successfully " -NoNewline
 Write-Host -ForegroundColor Green ([System.Char]::ConvertFromUtf32($EmojiIcon))
 
# или
 
$UNIGreen = [System.Char]::ConvertFromUtf32(([System.Convert]::toInt32("00002705",16)))
#$UNIRed   = [System.Char]::ConvertFromUtf32(([System.Convert]::toInt32("0000274C",16)))
$UNIRed   = [System.Char]::ConvertFromUtf32(([System.Convert]::toInt32("000026D4",16)))