Powershell: Zmienne globalne

28-lut-2019

W skryptach PowerShell można korzystać ze zmiennych lokalnych (widocznych wewnątrz funkcji), zmiennych skryptu (widocznych w skrypcie) i zmiennych globalnych (widoczne wszędzie). Popatrz na taki przykład:

function Show-Variable()
{
 echo "Inside the function: $MyVar"
 $MyVar='BLUE'
}
$MyVar = 'GREEN'
echo "Outside the function: $MyVar"
Show-Variable
echo "Outside the function: $MyVar"

Jest tutaj funkcja, która wyświetla wartość zmiennej zdefiniowanej początkowo na poziomie skryptu. Pytanie, czy ta zmienna będzie widoczna dla funkcji i czy rzeczywiście uda się ją zmienić?

Oto wynik:

Outside the function: GREEN
Inside the function: GREEN
Outside the function: GREEN
  • wewnątrz funkcji zmienna jest widoczna – to dobrze!
  • przypisanie wartości do zmiennej wewnątrz funkcji również nie zwraca żadnego błędu – to super!
  • Ale  kiedy funkcja się kończy, to zmienna ma starą wartość, i tak prawdę mówiąc, to też zazwyczaj jest oczekiwany pozytywny skutek

No ale czasami chcesz, żeby funkcja mogła zaktualizować zmienną z zewnątrz i żeby tak przypisana wartość została zachowana po zakończeniu funkcji. Co z tym zrobić? Otóż zmienne w PowerShell mają „obszar widoczności” – scope:

  • globalny – zmienna jest widoczna i może być aktualizowana przez każdy skrypt z rozwiązania (jeśli jest ich więcej), oraz jest widoczna i może być modyfikowana przez wszystkie funkcje (we wnętrzu tych funkcji)
  • skrypt – zmienna jest widoczna i może być modyfikowana przez skrypt oraz jest widoczna i może być modyfikowana przez wszystkie funkcje (we wnętrzu tych funkcji)
  • lokalny – domyślny dla funkcji – zmienne są widoczne i mogą modyfikowane tylko w danej funkcji

Oto jak można korzystać z tych scope:

function Show-Variable()
{
 echo "Inside the function: $global:MyVar"
 $global:MyVar = 'BLUE'
}
$global:MyVar = 'GREEN'
echo "Outside the function: $global:MyVar"
Show-Variable
echo "Outside the function: $global:MyVar"

Oto wynik:

Outside the function: GREEN
Inside the function: GREEN
Outside the function: BLUE

Teraz zmienna globalna była widoczna wewnątrz i na zewnątrz funkcji  i mogła być zmieniana zarówno wewnątrz jak i na zewnątrz funkcji. Pełny sukces!

Więcej o zakresach zmiennych:

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_scopes?view=powershell-6

Dodam jeszcze, że generalnie stosowanie zmiennych skryptowych i globalnych nie jest zalecane, ale często ten mechanizm pozwala znacznie uprościć logikę skryptu

 

 

 

 

 

 

 

 

Komentarze są wyłączone

Autor: Rafał Kraik