Share via


Set-StrictMode

式、スクリプト、およびスクリプト ブロックでのコーディング規則を確立し、適用します。

構文

Set-StrictMode
   -Version <Version>
   [<CommonParameters>]
Set-StrictMode
   [-Off]
   [<CommonParameters>]

説明

コマンドレットは Set-StrictMode 、現在のスコープとすべての子スコープの厳密モードを構成し、オンとオフを切り替えます。 厳密モードがオンの場合、式、スクリプト、またはスクリプト ブロックの内容が基本的なベスト プラクティスのコーディング規則に違反すると、PowerShell によって終了エラーが生成されます。

Version パラメーターを使用して、適用するコーディング規則を決定します。

Set-PSDebug -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

InvalidOperation: The variable '$a' cannot be retrieved because it has not been set.

厳密モードをバージョン 1.0に設定すると、初期化されていない変数の参照が失敗します。

例 2: バージョン 2.0 として strict モードを有効にする

# 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.

このコマンドは、厳密モードをオンにし、バージョン 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.0
$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."

厳密モードをバージョン 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.Version 型に変換できる文字列Latestまたは文字列である必要があります。 バージョンは、PowerShell の有効なリリース バージョンと一致している必要があります。

このパラメーターの有効な値は次のとおりです。

  • 1.0
    • 文字列内の初期化されていない変数を除き、初期化されていない変数への参照を禁止します。
  • 2.0
    • 初期化されていない変数への参照を禁止します。 これには、文字列内の初期化されていない変数が含まれます。
    • オブジェクトの存在しないプロパティへの参照を禁止します。
    • メソッドの呼び出しに構文を使用する関数呼び出しを禁止します。
  • 3.0
    • 初期化されていない変数への参照を禁止します。 これには、文字列内の初期化されていない変数が含まれます。
    • オブジェクトの存在しないプロパティへの参照を禁止します。
    • メソッドの呼び出しに構文を使用する関数呼び出しを禁止します。
    • 範囲外または解決できない配列インデックスを禁止します。
  • Latest
    • 利用可能な最新バージョンを選択します。 最新バージョンが最も厳密です。 新しいバージョンが PowerShell に追加された場合でも、スクリプトで使用可能な最も厳密なバージョンが使用されるようにするには、この値を使用します。

注意

スクリプトでのバージョン使用Latestは決定論的ではありません。 PowerShell の Latest 新しいリリースでは、その意味が変わる可能性があります。 使用する古いバージョンの PowerShell 用に記述されたスクリプトは、新しいバージョンの PowerShell Set-StrictMode -Version Latest で実行すると、より制限の厳しい規則の対象になります。

Type:Version
Aliases:v
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

入力

None

このコマンドレットにオブジェクトをパイプすることはできません。

出力

None

このコマンドレットは、出力を返しません。

メモ

Version パラメーターは、より3.0大きい値を受け入れますが、より大きい3.0値に対して追加のルールは定義されていません。

Set-StrictMode は、設定されているスコープとその子スコープでのみ有効です。 PowerShell のスコープの詳細については、「about_Scopes」を参照してください