Set-StrictMode
式、スクリプト、およびスクリプト ブロックでのコーディング規則を確立し、適用します。
構文
Set-StrictMode
-Version <Version>
[<CommonParameters>]
Set-StrictMode
[-Off]
[<CommonParameters>]
説明
コマンドレットは Set-StrictMode
、現在のスコープとすべての子スコープに対して厳格モードを構成し、オンとオフを切り替えます。 strict モードがオンの場合、式、スクリプト、またはスクリプト ブロックの内容が基本的なベスト プラクティスコーディング規則に違反すると、PowerShell によって終了エラーが生成されます。
Version パラメーターを使用して、適用されるコーディング規則を決定します。
Set-PSDebug -Strict
コマンドレットは、グローバル スコープの strict モードを有効にします。 Set-StrictMode
は、現在のスコープとその子スコープにのみ影響します。 そのため、スクリプトまたは関数でそれを使用して、グローバル スコープから継承された設定をオーバーライドできます。
がオフの場合 Set-StrictMode
、PowerShell には次の動作があります。
- 初期化されていない変数の値は、型に応じて 0 (ゼロ) または
$Null
と見なされます - 存在しないプロパティへの参照は、 を返します
$Null
- 不適切な関数構文の結果は、エラー条件によって異なります
- 配列内の無効なインデックスを使用して値を取得しようとすると、 が返されます
$Null
例
例 1: 厳密モードをバージョン 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
strict モードをバージョン 1.0 に設定すると、初期化されていない変数の参照が失敗します。
例 2: 厳密モードをバージョン 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
このコマンドは strict モードをオンにし、バージョン 2.0 に設定します。 その結果、関数呼び出しまたは参照の初期化されていない変数または存在しないプロパティにかっことコンマを使用するメソッド構文を使用すると、PowerShell からエラーが返されます。
サンプル出力は、バージョン 2.0 strict モードの効果を示しています。
バージョン 2.0 の厳格モードを使用しない場合、値 "(3,4)" は、何も追加されない 1 つの配列オブジェクトとして解釈されます。 バージョン 2.0 の厳密モードを使用すると、2 つの値を送信するための誤った構文として正しく解釈されます。
バージョン 2.0 がない場合、文字列の存在しない Month プロパティへの参照は のみを $Null
返します。 バージョン 2.0 を使用すると、参照エラーとして正しく解釈されます。
例 3: 厳密モードをバージョン 3.0 として有効にする
strict モードが Off に設定されている場合、無効または範囲外のインデックスの結果は 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
strict モードをバージョン 3 以上に設定すると、無効なインデックスまたは範囲外のインデックスがエラーになります。
パラメーター
-Off
現在のスコープとすべての子スコープに対して、このコマンドレットが strict モードをオフにすることを示します。
Type: | SwitchParameter |
Position: | Named |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Version
厳格モードでエラーとなる条件を指定します。 このパラメーターは、任意の有効な PowerShell バージョン番号を受け入れます。 3 より大きい数値は、 Latest として扱われます。
このパラメーターの有効な値は次のとおりです。
- 1.0
- 文字列内の初期化されていない変数を除き、初期化されていない変数への参照を禁止します。
- 2.0
- 初期化されていない変数への参照を禁止します。 これには、初期化されていない変数が文字列に含まれます。
- オブジェクトの存在しないプロパティへの参照を禁止します。
- メソッドの呼び出しに構文を使用する関数呼び出しを禁止します。
- 3.0
- 初期化されていない変数への参照を禁止します。 これには、初期化されていない変数が文字列に含まれます。
- オブジェクトの存在しないプロパティへの参照を禁止します。
- メソッドの呼び出しに構文を使用する関数呼び出しを禁止します。
- 範囲外または解決できない配列インデックスを禁止します。
- 最も遅い
- 利用可能な最新バージョンを選択します。 最新バージョンが最も厳密です。 新しいバージョンが PowerShell に追加された場合でも、スクリプトで使用可能な最も厳密なバージョンが使用されるようにするには、この値を使用します。
Type: | Version |
Aliases: | v |
Position: | Named |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
入力
None
パイプを使用してこのコマンドレットに入力を渡すことはできません。
出力
None
このコマンドレットによる戻り値はありません。
メモ
Set-StrictMode
は、それが設定されているスコープとその子スコープでのみ有効です。 PowerShell のスコープの詳細については、「 about_Scopes」を参照してください。