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