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 には次の動作があります。
- 初期化されていない変数は、型に応じて (ゼロ) または
$Null
の値0
を持つものと見なされます - 存在しないプロパティへの参照は、 を返します
$Null
- 不適切な関数構文の結果は、エラー条件によって異なります
- 配列内の無効なインデックスを使用して値を取得しようとすると、 が返されます
$Null
例
例 1: 厳密モードをバージョン 1.0 として有効にする
# Strict mode is off by default.
$a -gt 5
False
Set-StrictMode -Version 1.0
$a -gt 5
InvalidOperation: The variable '$a' cannot be retrieved because it has not been set.
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)
InvalidOperation: The function or command was called as if it were a method. Parameters should be separated by spaces. For information about parameters, see the about_Parameters Help topic.
Set-StrictMode -Off
$string = "This is a string."
$null -eq $string.Month
True
Set-StrictMode -Version 2.0
$string = "This is a string."
$null -eq $string.Month
PropertyNotFoundException: The property 'Month' cannot be found on this object. Verify that the property exists.
このコマンドは、strict モードをオンにし、バージョン 2.0
に設定します。 その結果、関数呼び出しまたは参照の初期化されていない変数または存在しないプロパティにかっことコンマを使用するメソッド構文を使用すると、PowerShell からエラーが返されます。
サンプル出力は、バージョン 2.0
厳格モードの効果を示しています。
バージョン 2.0
厳密モードを使用しない場合、 (3,4)
値は、何も追加されない単一の配列オブジェクトとして解釈されます。 バージョン 2.0
厳密モードを使用すると、2 つの値を送信するための構文が正しく解釈されます。
バージョン 2.0
がない場合、文字列の存在しない Month プロパティへの参照は のみを $Null
返します。 バージョン 2.0
を使用すると、参照エラーとして正しく解釈されます。
例 3: 厳密モードをバージョン 3.0 として有効にする
strict モードが Off に設定されている場合、無効または範囲外のインデックスの結果は null 値を返します。
# Strict mode is off by default.
$a = @(1)
$null -eq $a[2]
$null -eq $a['abc']
True
True
Set-StrictMode -Version 3
$a = @(1)
$null -eq $a[2]
$null -eq $a['abc']
OperationStopped: Index was outside the bounds of the array.
InvalidArgument: Cannot convert value "abc" to type "System.Int32". Error: "Input string was not in a correct format."
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
扱われます。 指定する値は、System.VersionLatest
型に変換できる文字列または文字列である必要があります。 バージョンは、PowerShell の有効なリリース バージョンと一致している必要があります。
このパラメーターの有効な値は次のとおりです。
1.0
- 文字列内の初期化されていない変数を除き、初期化されていない変数への参照を禁止します。
2.0
- 初期化されていない変数への参照を禁止します。 これには、初期化されていない変数が文字列に含まれます。
- オブジェクトの存在しないプロパティへの参照を禁止します。
- メソッドの呼び出しに構文を使用する関数呼び出しを禁止します。
3.0
- 初期化されていない変数への参照を禁止します。 これには、初期化されていない変数が文字列に含まれます。
- オブジェクトの存在しないプロパティへの参照を禁止します。
- メソッドの呼び出しに構文を使用する関数呼び出しを禁止します。
- 範囲外または解決できない配列インデックスを禁止します。
Latest
- 利用可能な最新バージョンを選択します。 最新バージョンが最も厳密です。 新しいバージョンが PowerShell に追加された場合でも、スクリプトで使用可能な最も厳密なバージョンが使用されるようにするには、この値を使用します。
注意事項
スクリプトで のバージョン を Latest
使用する。 の意味 Latest
は、PowerShell の新しいリリースで変更される可能性があります。 そのため、 を使用 Set-StrictMode -Version Latest
する古いバージョンの PowerShell 用に記述されたスクリプトは、新しいバージョンの PowerShell で実行すると、より制限の厳しい規則の対象になります。
Type: | Version |
Aliases: | v |
Position: | Named |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
入力
None
パイプを使用してこのコマンドレットに入力を渡すことはできません。
出力
None
このコマンドレットによる戻り値はありません。
メモ
Set-StrictMode
Version パラメーターは より3.0
大きい値を受け入れますが、現在、 より3.0
大きい値に対して追加のルールは定義されていません。
Set-StrictMode
は、それが設定されているスコープとその子スコープでのみ有効です。 PowerShell のスコープの詳細については、「 about_Scopes」を参照してください。