Seriál Windows PowerShell - Záchranné parametry (část 44.)

Dnešní článek je opět inspirován životem a drsnou zkušeností. Ale nemusíte se bát, žádnému zvířátku se nic nestalo a nebohý administrátor o práci nepřišel.

Mám jedno pravidlo, které někteří „odvážnější“ kolegové a zákazníci občas se smíchem znevažují. Vždycky když pouštím nějaký skript či one-liner na produkčním serveru, používám parametr WhatIf. Zároveň mám rád, když při prvních testech mohu použít parametr Verbose. Chci prostě vidět, co PowerShell dělá a mít šanci v dalším běhu zasáhnout. Myslím, že jsem tuto informaci už několikrát zmiňoval. Pojďme se podívat na nejčerstvější příběh.

Administrátor jedné firmy (říkejme mu Tomáš, Kanty s dovolením promine) vytvářel virtuální počítače pomocí jednoho cmdletu. Jelikož potřeboval vše vyřešit rychle, našel jeden takový na webu, vložil jej do konzole, a hle – než si všiml, co se děje, smazal si několik virtuálů ze svého Hyper-V serveru.

Určitě to znáte, na webu vidíte kód, který se nevejde na šířku stránky, takže tento kód pokračuje a vy nevidíte, co je dále. Ale to přeci nevadí, označíte celou řádku, vložíte ji do konzole a pak upravíte. Pozor! Zde je jedna nepříjemná vlastnost konzole – konec řádku je Enter a Enter spouští příkaz. To, co Tomáš viděl na webu, bylo zhruba (teoretický příklad, syntaxi si již nepamatuji):

Get-VM –Name * | Set-VM –Network něco –Memory 12

Ovšem co neviděl za koncem sloupce bylo:

… | Remove-VM

Opravdu teď nedokážu z hlavy vydolovat, proč na webu řádka končila odebráním počítače, ale to teď není důležité. Výsledek je jasný – mizející seznam počítačů z Hyper-V konzole.

Takže od té doby je vidět, že každý kód, který kopíruje, jde nejdříve do notepadu a teprve poté do konzole. Stejnou službu provede i ISE, které ve skriptu kód nespouští.

Jak můžete něčemu takovému zamezit? Mým oblíbeným je WhatIf. Před několika lety jsem kdesi popisoval, jak zapnout natrvalo tento parametr. Nyní můžeme použít mou oblíbenou proměnnou PsDefaultParameterValues.

Pro ty, co neznají WhatIf. Zkuste si pustit následující příkazy:

image

Pokud bych vynechal WhatIf, proces by byl zastaven. Stejně jako začaly být odebírány virtuální počítače na začátku tohoto článku. Tímto ovšem nezamezíme plně zmiňovanému scénáři kopírování z webu – WhatIf bychom nestačili dopsat. Podívejme se, kolik cmdletů WhatIf používá.

image

Když se podíváme na to, o jaký typ cmdletů se jedná:

image

Je nejčastější případ Remove.

Proměnná WhatIfPreference určuje, že ve standardním režimu není WhatIf zapnuté. Pomocí nastavení na True se budou cmdlety chovat, jako by tento parametr byl vždy uveden. Pomocí PsDefaultParameterValues uděláme to samé, ale cestou, kterou pravděpodobně nastavujeme i další chování různých kombinací cmdletů a jejich parametrů.

image

Vidíte, že i bez uvedení parametru WhatIf se notepad nezavřel. Pokud bychom chtěli tuto funkcionalitu vyřadit, musíme určit hodnotu parametru. U přepínačů to probíhá následujícím způsobem:

image

V tomto případě je již notepad vypnut. Nevýhodu vidím v tom, že proměnná WhatIfPreference je stále nastavena na False:

image

Což může být pro někoho matoucí. Můžete si vybrat libovolnou z cest a potřebné nastavení si vložit do svého profilu.

Podobné to je s parametrem Verbose. Pokud chcete, aby se vám podrobné informace vždy zobrazovaly, nastavte si v profilu hodnotu tak, jak potřebujete. Více informací o Verbose a jeho chování najdete v helpu, např::

image

Mimochodem, všimli jste si, jak je konzole při použití PSReadLine čitelnější? Více jsem o tomto modulu psal v jednom z předchozích Flashů. Jestli jste ještě nezkoušeli, vyzkoušejte je

David Moravec, MVP
Mainstream Technologies