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:
Dodam jeszcze, że generalnie stosowanie zmiennych skryptowych i globalnych nie jest zalecane, ale często ten mechanizm pozwala znacznie uprościć logikę skryptu