funkcje w powershell to bardzo dziwny i nieintuicyjny wynalazek. należy więc intuicję zmienić, a to oznacza – zrozumieć jak ten diabeł działa. pełny art w wer. angielskiej polecam przeczytać, ponieważ to w pełni wyjaśnia problem. ja przedstawię go po swojemu – czyli w skrócie i na przykładach q:
weźmy prostą funkcję testową:
function fun { param ($str) echo "będe liczył" $str+="aaaa" return $str } $a="coś" $a+=fun("!!!") echo $a
znając trochę języki programowania można się spodziewać, że na ekranie pojawi się:
będę liczył
coś!!!aaaa
tymczasem realny output będzie zaskaqjący:
cośbęde liczył!!!aaaa
o co cho? cała funkcja konwertowana jest w locie na obiekt. wszystko, co ‘wychodzi’ z funkcji traktowane jest jako atrybut obiektu. w związq z tym:
- return nie jest potrzebny – kończy wykonanie funkcji, ale zwykły output wystarczy
- każdy output jest jednym z atrybutów obiektu zwracanego przez funkcję
przy tej samej funkcji można zrobić inne doświadczenie:
$a=fun("!!!") $a $a.length $a[1]
które pokaże, że zwracana jest dwuelementowa tablica zawierająca “będę liczył” oraz “!!!aaaa”.
funkcja w najprostszej postaci może wyglądać zatem tak:
function fun { param ($str) "aaaa"+$str }
jeśli zatem w funkcji wykorzystywana jest jakaś funkcja zwracająca cokolwiek na ekran, niezbędne jest dodanie “|out-null” żeby nie otrzymać tego jako atrybut w zwracanym obiekcie.
eN.