Powershell: echo nie działa!

19-Gru-2018

Popatrz na taki skrypt:

function doSomething()
{
 param($times)

 $i = 0
 while ($i -lt $times)
 {
   echo "$i"
   $i++
 }
}

doSomething 3

Jeśli go uruchomisz, to wszystko działa jak należy. Funkcja jest wywoływana, polecenie echo wyświetla wyniki. Ale wystarczy drobna zmiana:

function doSomething()
{
 param($times)

 $i = 0
 while ($i -lt $times)
 {
   echo "$i"
   $i++
 }
}

$result = doSomething 3

Wynik funkcji zapisujemy w zmiennej i co? Nagle z ekranu znikają wszystkie komunikaty i po uruchomieniu skryptu nic się nie wyświetla. Echo nie działa? Tak podstawowe polecenie jak Write-Output ma problem?

Otóż polecenie echo czy write-output powoduje, że funkcja coś zwraca. To nie jest typowe polecenie do wyświetlania czegoś na ekranie. Dlatego chociaż funkcja nie ma instrukcji return, to zwraca to co jest argumentem polecenia echo. Dlatego jeżeli wynik polecenia zostanie zapisany w zmiennej, to ekran pozostaje pusty. Żeby się o tym przekonać, wystarczy sprawdzić zawartość zmiennej $result

Takie zachowanie funkcji można próbować obejść zamieniając polecenie echo lub Write-Output przez Write-Host. Write-Host zawsze tylko wyświetla, nie ma więc obaw, że przypisanie wyniku funkcji do zmiennej spowoduje, że coś zniknie z ekranu:

function doSomething()
{
 param($times)

 $i = 0
 while ($i -lt $times)
 {
   Write-Host "$i"
   $i++
 }
}

$result = doSomething 3

 

Dodaj komentarz:

Autor: Rafał Kraik