AvoidGlobalVars

重症度レベル:警告

デフォルト状態:常に有効

Description

スクリプトや関数のグローバル変数を変更するのは避けるべきです。なぜなら、同じセッションで動作する他のスクリプトや関数がそれらに依存してしまうからです。 これにより予期せぬ挙動が起きたり、デバッグが難しくなることがあります。

このルールはグローバルスコープ修飾子で変数の使用を検出します。 PowerShellはスコーピングと呼ばれる仕組みを通じて、変数、関数、エイリアス、ドライブへのアクセスを制御します。 PowerShell起動時に存在する変数や関数はグローバルスコープで作成されました。 グローバルに適用される変数には以下が含まれます:

  • 自動変数
  • 好み変数

このルールは、グローバルスコープで変数を作成するための New-Variable コマンドレットや、グローバルスコープの変数を扱う他の *-Variable コマンドレットの使用を検出しません。 グローバルスコープ修飾子付きの変数式のみを検出します。$global:example

このルールは、変数名が 自動変数 または 優先変数であるグローバルスコープ修飾子を使う変数式には適用されません。

変数にはグローバルスコープではなくローカルスコープやスクリプトスコープを使いましょう。 詳しくは about_Scopesをご覧ください。

例

非準拠

$var1 = 'foo'
function Test-NotGlobal ($var) {
    $Global:var1 = $var
}
Test-NotGlobal 'bar'
$var1

対応

$var1 = 'foo'
function Test-NotGlobal ($var) {
    $var1 = $var
}
Test-NotGlobal 'bar'
$var1

ルールの設定

このルールは常に有効で、設定はできません。 このルールを避けるために、以下のいずれかの方法を用いてください。

  • 欲しいルールだけを含めるか、不要なルールを除外するカスタムルール設定ファイルを作成しましょう。
  • 特定のコードブロックに対してルール抑制を抑制するために、適切なルール抑制属性をコードに追加してください。 詳細については、PSScriptAnalyzerの使用に関する「抑制ルール」セクションをご覧ください。