| Zkurvená pseudosyntaxe. Příklad, který mě nasral na maximum. Jak známo, když se vrací z funkce pole, tak miláček PowerShell dělá automaticky jednu podělanou konverzi. Když vracíte pole s jedním prvkem, tak on to zkonvertuje jen na ten jeden prvek. Když vracíte víceprvkové pole, tak to v klidu vrátí celé pole. Můžete si to vyzkoušet jednoduše, například s get-process. Stačí, když si pustíte nejprve 1 notepad a zkusíte následující skript. Když to potom zkusíte s více notepady, tak dostanete jiný výsledek get-member:
$poleNeboJeden = get-process notepad gm -i $poleNeboJeden
To už samo o sobě je na posrání. Protože obvykle nevíte dopředu, jestli vypadne jeden, nebo více. Nemůžete se tedy vždycky odkazovat na člena Count, protože ten u jednotlivých objektů není. Nebo když je, tak má úplně jiný význam, což se samozřejmě projeví až v produkci, ideálně smazáním půlky adčka. No prostě už samo o sobě kokotina.
Dobře. Ale to se dá vyřešit jednoduše. Musíte pro return z funkce použít speciální čárkový operátor, který takto funguje jenom u return: (kdybyste to použili na pole jinde než v return, tak se to pole zapolí do vnitřního pole):
function Get-ArrayAlwaysEvenIfSingleObject ([int] $shitCount)
# Normally, function return values are converted from single
# member arrays to the single object while more-member arrays remain as arrays
# Example would be with "get-process notepad", which returns either a single object
# or an array of the processes if more then a single notepad is running
# My function, on the other side, returns an array always
# regardles it has no/one/more members. To achieve this functionality
# PowerShell has the special (,) construct
# This function returns array with either 0 or more numbers according to
# the number specified in its input parameter $numberCount
{
[string[]] $fcResult = @()
if ($shitCount -gt 0) {
$fcResult = (1..$shitCount) | % { "shit $_" }
}
return (, $fcResult) # this is always an array
}
Get-ArrayAlwaysEvenIfSingleObject 7
Kůl. Takže výsledek tohoto je vždycky pole, bez ohledu na to, kolik hoven chcete. Funkce je nesmyslná, ale na ukázku to snad stačí. Takže jednu sračku jsme vyřešili, sice člověk zvyklý na jednoduchou a smysluplnou syntaxi by se z toho poblil, ale dobrá.
Horší je, že i nadále nepřestávají padat sračky. Následující dva zápisy se liší jenom v tom, že jsem to ozávorkoval. V prvním případě to nefunguje. Ve druhém už jo, ale obalovat všechno do závorek, to může napadnout jenom nějakýho mentálně stiženýho a případně i zhulenýho inda:
# The expected behavior would be to see just 5,6,7 numbers returned
# but it actually displays all the numbers instead. The reason is
# that it pipes the array as the only object through to the where-object (?)
# instead of piping individual members.
Get-ArrayAlwaysEvenIfSingleObject 7 | select -last 3
# To repair the behavior and get expected results
# you must enclose the function into brackets
(Get-ArrayAlwaysEvenIfSingleObject 7) | select -last 3
Důvodem je zřejmě to, že v prvním případě se pajpuje jenom ten jeden polní objekt, zatímco v druhém to korektně přepajpuje všechny členy pole po jednom.
|