Seriál Windows PowerShell – Vylepšená konzole (část 42.)

Dnes bych vám rád ukázal modul, který hezkým způsobem zjednodušuje práci v konzoli.

Na téma konzole bylo napsáno a řečeno mnoho (a většinou to byly nepěkné věci). Mnoho lidí se diví, proč PowerShell používá stejnou konzoli jako cmd.exe. Sám Jeffrey Snover jednou řekl, že to je dědictví minulosti, kterého se bohužel PowerShell jen tak nezbaví.

Existuje mnoho náhrad pro konzoli, namátkou můžu jmenovat např. PoshConsole nebo ConEmu. Nesmíme zapomínat ani na PowerShell ISE. Já osobně nepoužívám žádný z prvně jmenovaných editorů. Hlavním důvodem je to, že si chci vystačit se základní nabídkou standardního PowerShellu.

To ovšem neznamená, že rozšíření konzole považuji za zlo. Spíše využívám nabídky různých modulů a úpravu svého profilu. Jak jsem již psal dříve – profil, skripty a moduly spouštím z adresáře, který mám synchronizovaný v cloudu a na všech svých počítačích. Tím mám vyřešeny „své“ konzole. Jedním z modulů, který takto využívám je PSReadLine.

Instalace je jednoduchá, stačí si stáhnout ZIP soubora nakopírovat jej do adresáře s moduly. Poté jej můžete importovat buď ručně z konzole, nebo ze svého profilu. Modul nefunguje v PowerShell ISE, takže je potřeba při volání z profile.ps1 určit, že importujeme pouze z konzole:

if ($host.Name -eq 'ConsoleHost')
{
Import-Module PSReadline
}

Modul má několik zajímavých funkcí (některé pokročilejší jsou popsány na stránce zmiňované výše), ukážeme si ty zřejmě nejčastěji využívané.

Zvýrazňování syntaxe

Na první pohled poznáte nejviditelnější změnu: zvýrazňování syntaxe. Funguje jak na cmdlety, tak na proměnné, texty, …

image

Jedná se o velice jednoduchou pomůcku, ale co se týče přehlednosti, nemůžu si ji vynachválit.

Doplňování

Další zajímavostí je doplňování příkazů a parametrů. Standardně můžete několikanásobným stiskem klávesy Tab vyvolat doplňování např. jmen cmdletů. V konzoli ovšem nefunguje Intelli Sense ve smyslu, že vidíte všechny příkazy, parametry, které splňují „prozatímní zadání“. PsReadLine vám toto umožňuje.

V ISE jistě znáte toto:

image

Pokud Intelli Sense zmizí, můžete jej vyvolat zpětně kombinací kláves Ctrl+mezera. To samé vám umožňuje PsReadLine v konzoli. Ukažme si to prakticky. Po napsání Write- jsem stiskl Ctrl+mezera:

image

V konzoli se objeví seznam cmdletů splňujících mé zadání.

Stejný postup použiji i na dalších obrázcích. Zde vidím jméno parametru

image

A zde hodnoty parametru, které mohu použít:

image

Nejčastěji tuto funkcionalitu využívám, když se chci podívat, jak cmdlety jsou dostupné. Standardním způsobem je volání Get-Command:

>_ Get-Command -Module Azure -Verb get

CommandType Name ModuleName
----------- ---- ----------
Cmdlet Get-AzureAccount Azure
Cmdlet Get-AzureAclConfig Azure
Cmdlet Get-AzureAffinityGroup Azure
Cmdlet Get-AzureCertificate Azure
Cmdlet Get-AzureDataDisk Azure
Cmdlet Get-AzureDeployment Azure
Cmdlet Get-AzureDisk Azure
Cmdlet Get-AzureDns Azure
Cmdlet Get-AzureEndpoint Azure
Cmdlet Get-AzureEnvironment Azure
Cmdlet Get-AzureLocation Azure
Cmdlet Get-AzureMediaServicesAccount Azure
Cmdlet Get-AzureOSDisk Azure
Cmdlet Get-AzureOSVersion Azure
Cmdlet Get-AzurePublishSettingsFile Azure
Cmdlet Get-AzureRemoteDesktopFile Azure
Cmdlet Get-AzureRole Azure
Cmdlet Get-AzureSBAuthorizationRule Azure
Cmdlet Get-AzureSBLocation Azure
Cmdlet Get-AzureSBNamespace Azure
Cmdlet Get-AzureService Azure
… (zkráceno)

Obrazovka mi odjede a já pak skroluji zpět, abych se podíval. Mohu samozřejmě využít cmdlet Format-Wide pro jednodušší zobrazení:

image

Ale pokud vím, že tým, který cmdlety vytvářel, používá standardní jmennou konvenci a prefix pro své cmdlety, mohu použít PsReadLine:

image

Tipy

Po instalaci modulu bych vám doporučil vyzkoušet si ukázané příklady. Poté zjistíte, že byste vaši konzoli chtěli dále upravovat.

Příkaz, který zatím standardně v PsReadLine chybí je Ctrl+End – mazání řádky až do konce. Tuto funkcionalitu můžete doplnit pomocí následujícího příkazu:

Set-PSReadlineKeyHandler -Key Ctrl+End -BriefDescription KillLine -Handler { [PSConsoleUtilities.PSConsoleReadLine]::KillLine() }

Další typy jsou dostupné na již zmíněné stránce. Abych jenom nechválil. Jedna věc mi na PsReadLine vadí. Při kopírování většího množství textu do konzole (typicky listing funkce, kterou chci vyzkoušet) probíhá vložení do konzole velmi pomalu (efekt psacího stroje). Je to tím, že probíhá kontrola syntaxe při vložení každého znaku a zpomalení je v některých případech znatelné.

Doufám, že se vám dnešní tip líbil a že vám přijde vhod.

David Moravec, MVP
Mainstream Technologies