Set-StrictMode
Ustanawia i wymusza reguły kodowania w wyrażeniach, skryptach i blokach skryptów.
Składnia
Set-StrictMode
-Version <Version>
[<CommonParameters>]
Set-StrictMode
[-Off]
[<CommonParameters>]
Opis
Polecenie cmdlet Set-StrictMode
konfiguruje tryb ścisły dla bieżącego zakresu i wszystkich zakresów podrzędnych oraz włącza i wyłącza. Gdy tryb ścisły jest włączony, program PowerShell generuje błąd zakończenia, gdy zawartość wyrażenia, skryptu lub bloku skryptu narusza podstawowe reguły kodowania najlepszych rozwiązań.
Użyj parametru Version, aby określić, które reguły kodowania są wymuszane.
Set-PSDebug -Strict
polecenie cmdlet włącza tryb ścisły dla zakresu globalnego.
Set-StrictMode
ma wpływ tylko na bieżący zakres i jego zakresy podrzędne. W związku z tym można użyć go w skrycie lub funkcji, aby zastąpić ustawienie dziedziczone z zakresu globalnego.
Po wyłączeniu Set-StrictMode
program PowerShell ma następujące zachowania:
- Zakłada się, że niezainicjowane zmienne mają wartość 0 (zero) lub
$Null
, w zależności od typu - Odwołania do nieistniejących właściwości zwracają
$Null
- Wyniki nieprawidłowej składni funkcji różnią się w zależności od warunków błędu
- Próba pobrania wartości przy użyciu nieprawidłowego indeksu w tablicy zwraca
$Null
Przykłady
Przykład 1. Włączanie trybu ścisłego jako wersja 1.0
# Strict mode is off by default.
$a -gt 5
False
Set-StrictMode -Version 1.0
$a -gt 5
The variable $a cannot be retrieved because it has not been set yet.
At line:1 char:3
+ $a <<<< -gt 5
+ CategoryInfo : InvalidOperation: (a:Token) [], RuntimeException
+ FullyQualifiedErrorId : VariableIsUndefined
W trybie ścisłym ustawionym na wersję 1.0 próbuje odwołać się do zmiennych, które nie są inicjowane, kończą się niepowodzeniem.
Przykład 2. Włączanie trybu ścisłego jako wersja 2.0
# Strict mode is off by default.
function add ($a, $b) {
'$a = ' + $a
'$b = ' + $b
'$a+$b = ' + ($a + $b)
}
add 3 4
$a = 3
$b = 4
$a+$b = 7
add(3,4)
$a = 3 4
$b =
$a+$b = 3 4
Set-StrictMode -Version 2.0
add(3,4)
The function or command was called like a method. Parameters should be separated by spaces,
as described in 'Get-Help about_Parameter.'
At line:1 char:4
+ add <<<< (3,4)
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : StrictModeFunctionCallWithParens
Set-StrictMode -Off
$string = "This is a string."
$string.Month -eq $null
True
Set-StrictMode -Version 2.0
$string = "This is a string."
$string.Month -eq $null
Property 'Month' cannot be found on this object; make sure it exists.
At line:1 char:9
+ $string. <<<< month
+ CategoryInfo : InvalidOperation: (.:OperatorToken) [], RuntimeException
+ FullyQualifiedErrorId : PropertyNotFoundStrict
To polecenie włącza tryb ścisły i ustawia go na wersję 2.0. W związku z tym program PowerShell zwraca błąd, jeśli używasz składni metody, która używa nawiasów i przecinków, dla wywołania funkcji lub odwołania do niezainicjowanych zmiennych lub nieistniejących właściwości.
Przykładowe dane wyjściowe pokazują efekt trybu ścisłego w wersji 2.0.
Bez trybu ścisłego w wersji 2.0 wartość "(3,4)" jest interpretowana jako pojedynczy obiekt tablicy, do którego nic nie jest dodawane. Korzystając z trybu ścisłego w wersji 2.0, jest on poprawnie interpretowany jako błędna składnia przesyłania dwóch wartości.
Bez wersji 2.0 odwołanie do nieist niejącej właściwości Month month zwraca tylko $Null
. Korzystając z wersji 2.0, jest on poprawnie interpretowany jako błąd odwołania.
Przykład 3. Włączanie trybu ścisłego jako wersja 3.0
W trybie ścisłym ustawiono wartość Wyłączone, nieprawidłowe lub poza indeksami wynik zwraca wartości null.
# Strict mode is off by default.
$a = @(1)
$a[2] -eq $null
$a['abc'] -eq $null
True
True
Set-StrictMode -Version 3
$a = @(1)
$a[2] -eq $null
$a['abc'] -eq $null
Index was outside the bounds of the array.
At line:1 char:1
+ $a[2] -eq $null
+ ~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (:) [], IndexOutOfRangeException
+ FullyQualifiedErrorId : System.IndexOutOfRangeException
Cannot convert value "abc" to type "System.Int32". Error: "Input string was not in a correct format."
At line:1 char:1
+ $a['abc'] -eq $null
+ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvalidCastFromStringToInteger
W przypadku trybu ścisłego ustawionego na wersję 3 lub nowszą nieprawidłowe lub poza indeksami granic powodują błędy.
Parametry
-Off
Wskazuje, że to polecenie cmdlet wyłącza tryb ścisły dla bieżącego zakresu i wszystkich zakresów podrzędnych.
Typ: | SwitchParameter |
Position: | Named |
Domyślna wartość: | None |
Wymagane: | True |
Akceptowanie danych wejściowych potoku: | False |
Akceptowanie symboli wieloznacznych: | False |
-Version
Określa warunki, które powodują błąd w trybie ścisłym. Ten parametr akceptuje dowolny prawidłowy numer wersji programu PowerShell. Dowolna liczba wyższa niż 3 jest traktowana jako Latest.
Obowiązujące wartości tego parametru to:
- 1.0
- Uniemożliwia odwoływania się do niezainicjowanych zmiennych, z wyjątkiem niezainicjowanych zmiennych w ciągach.
- 2.0
- Uniemożliwia odwoływania się do niezainicjowanych zmiennych. Obejmuje to niezainicjowane zmienne w ciągach.
- Uniemożliwia odwoływania się do nieistniejących właściwości obiektu.
- Uniemożliwia wywołania funkcji używające składni do wywoływania metod.
- 3.0
- Uniemożliwia odwoływania się do niezainicjowanych zmiennych. Obejmuje to niezainicjowane zmienne w ciągach.
- Uniemożliwia odwoływania się do nieistniejących właściwości obiektu.
- Uniemożliwia wywołania funkcji używające składni do wywoływania metod.
- Zakazać poza granicami lub nierozwiązanych indeksów tablicy.
- Najnowszy
- Wybiera najnowszą dostępną wersję. Najnowsza wersja jest najbardziej rygorystyczna. Użyj tej wartości, aby upewnić się, że skrypty korzystają z najściślejszej dostępnej wersji, nawet w przypadku dodania nowych wersji do programu PowerShell.
Typ: | Version |
Aliasy: | v |
Position: | Named |
Domyślna wartość: | None |
Wymagane: | True |
Akceptowanie danych wejściowych potoku: | False |
Akceptowanie symboli wieloznacznych: | False |
Dane wejściowe
None
Nie można przekazać danych wejściowych potoku do tego polecenia cmdlet.
Dane wyjściowe
None
To polecenie cmdlet nie zwraca żadnych danych wyjściowych.
Uwagi
Set-StrictMode
jest skuteczny tylko w zakresie, w którym jest ustawiany i w zakresach podrzędnych. Aby uzyskać więcej informacji na temat zakresów w programie PowerShell, zobacz about_Scopes.