PowerShell, stejně jako další textové Shelly má 2 tváře, příkazové rozhraní a skriptování. Pro příkazové rozhraní slouží konzola PowerShell (na Windows PowerShell.exe), nebo Windows Terminal. Příkazové prostředí slouží k manuálnímu provádění příkazů, nebo spouštění skriptů. Skriptovací rozhraní je malinko složitější, takže si jej rozebereme dále trochu podrobněji.
Nativní nástroj na Windows – PowerShell ISE
Všechny verze Windows s grafickým rozhraním (tedy všechny krom Windows server Core a Windows server Nano) obsahují nástroje PowerShell ISE, který slouží k editaci a tvorbě skriptů a dalších PowerShell souborů. PowerShell ISE je primárně určeno pro Windows PowerShell (tedy PowerShell verze 1.0 až 5.1), pro PowerShell verze 6 a novější je sice možné ISE využít, ale doporučeno je využití VS Code, kde je nápověda a doplňování příkazů nastavená primárně na nejnovější podporovanou verzi PowerShellu. Z nástrojů ostatních vývojářů je snad nejpokročilejším PowerShell studio, ale osobně i tak dávám přednost jednoduchému ISE.

Krom interaktivní možnosti vyhledávání příkazů, jejichž parametry je možné vyplnit pomocí formuláře, umožňuje využívat a vytvářet tzv. snipety.

Snipety
Snipety jsou šablony většího kusu syntaxe, jako jsou třídy, DSC, funkce, cykly či podmínky. Seznam dostupných snipetů se vyvolá stiskem CTRL + J v místě, kam chceme daný snipet vložit.

Pojďme si nyní ukázat, jak využít snipet pro tvorbu tzv. andvanced function. Nejprve pomocí CTRL + J vyvoláme nabídku snipetů a v ní najdeme Advanced Function. Po kliknutí na tuto nabídku se nám vloží kód.

Jak je vidět na obrázku výše, vloží se nám šablona kódu, kterou začneme doplňovat, a výsledek může být např.:
<#
.Synopsis
kontrola systémovýh souborů.
.DESCRIPTION
kontrola systémových souborů nativními nástroji scf a dism
.EXAMPLE
Check-SystemFiels -scannow
provede příkaz sfc /scannow
.EXAMPLE
Check-SystemFiels -scanfile -Path c:\windows\system32\kernel32.dll
Provede kontrolu integrity a pokusí se o opravu souboru kernel32.dll
#>
function Check-SystemFiles
{
Param
(
# nápověda
[Parameter(ValueFromPipelineByPropertyName=$true,
Position=0)]
[string] $path,
# scannow
[switch] $scannow,
#verifikace
[switch] $verifyonly,
#kontrola souboru
[switch] $scanfile,
#offline kontrola
[switch] $offline,
#kontrola souboru
[switch] $verifyfile,
#offline boot adresář
[string] $offbootdir,
#offline winadresář
[string] $offwindir,
#oprava MS Store komponent
[switch] $store
)
Begin
{
if((whoami /priv /fo csv | convertfrom-csv | select "Privilege Name")."Privilege Name" -contains "SeImpersonatePrivilege")
{}
else
{
Write-Error "Tento úkon smí vykonávat pouze správce"
Start-Process "$PSHOME\powershell.exe" -Verb Runas -ArgumentList "-command 'import-module AdminTools'"
}
if($scanfile -and ($path -eq ''))
{
Write-Error 'Není uvedená cesta k ověřovanému souboru'
Pause
}elseif($verifyfile -and ($path -eq ''))
{
Write-Error 'Není uvedená cesta k ověřovanému souboru'
Pause
}elseif($offline -and (($path -eq '') -or ($offbootdir -eq '') -or ($offwindir -eq '')))
{
Write-Error 'Není uvedená cesta k některému z offline adresářů'
Pause
}
}
Process
{
if($scannow)
{
$prikaz = 'sfc /scannow'
Invoke-Expression -Command $prikaz
}
elseif ($verifyonly)
{
$prikaz = 'sfc /verifyonly'
Invoke-Expression -Command $prikaz
}
elseif ($scanfile)
{
$prikaz = 'sfc /scanfile=' + $path
Invoke-Expression -Command $prikaz
}
elseif($verifyfile)
{
$prikaz = 'sfc /VERIFYFILE=' + $path
Invoke-Expression -Command $prikaz
}
elseif($offline)
{
$prikaz = 'sfc /scanfile=' + $path + '/OFFBOOTDIR=' + $offbootdir + '/OFFWINDIR=' + $offwindir
Invoke-Expression -Command $prikaz
}elseif($store)
{
$prikaz = 'DISM /Online /cleanup-image /ScanHealth'
Invoke-Expression -Command $prikaz
$prikaz = 'dism /online /cleanup-image /restorehealth'
Invoke-Expression -Command $prikaz
}
}
End
{
}
}
Na kódu výše je vidět, že některé části šablony jsem nevyužil a tudíž jsem je smazal. Výhodou využití snipetu je, že člověk při psaní nezapomene na žádnou část včetně nápovědy, která je opravdu důležitá.
Tvorba vlastního snipetu
PowerShell ISE není omezeno pouze na výchozí sadu snipetů, ale každý člověk si může vytvořit vlastní snipety. Jde o dokumenty ve formátu ps1xml. K vytvoření slouží příkaz New-IseSnippet a vlastní šablona (tělo snpetu) se vkládá jako text. Dále uvádím 2 příklady, kterými jsem si rozšířil své ISE, první generuje blok nápovědy k funkci (protože si často píši tělo funkce ručně bez snipetu)
New-IseSnippet -Title Comment-BasedHelp -Description "A template for comment-based help." -Text "<#
.SYNOPSIS
.DESCRIPTION
.PARAMETER <Parameter-Name>
.INPUTS
.OUTPUTS
.EXAMPLE
.LINK
.NOTE
#>" -Force
Možnost Force říká, že má dojít k přepisu již existujícího snipetu se stejným jménem, tímto parametrem se dosahuje aktualizací (oprav) vlastních snipetů. Druhý příklad prak tvoří šablonu pro vložená povinného parametru funkce či skriptu.
$M = @'
Param
(
[parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true,Position=<pozice>)]
[<type>]
$<ParameterName>
)
'@
New-ISESnippet -Text $M -Title MandatoryParameter -Description "Adds a mandatory function parameter." -Force
Import Snipetů
Snipety je možné sdílet s kolegy, nebo mezi více zařízeními pomocí sdílené složky, nebe vyměnitelného média. Bohužl takto dostupné snipety není možné hned využívat, ale musí dojít k jejich importu, který se děje pomocí příkazu Import-IseSnippet viz příkaz níže:
Import-IseSnippet -Path \\Server01\Public\Snippets -Recurse
Alternativou je snipety importovat pomocí správy souborů. (takto nelze snipety importovat ze snipetových modulů). Ze zdíleného média zkopírujeme požadované snipety (soubory formátu ps1xml) do: %userprofile%\Documents\WindowsPowerShell\Snippets
Takto přidané snipety jsou k dispozici až po novém spuštění ISE.
Podrobnější informace o snipetech najdete v dokumentaci Na závěr prozradím, že snipety není možné využívat ve VS Code a PowerShell studio má vlastní sadu obdobných možností.