Windows PowerShell スクリプトで変数スコープを使用する
直感的には、関数が完了したときに、関数で設定した $computer という名前の変数にスクリプトでアクセスできると想定するでしょう。 しかし、そうではありません。 変数には特定のスコープがあり、スコープ間のやり取りの方法が制限されています。
次の表では、3 つのスコープと、それらが変数の使用にどのように影響するかを説明します。
表 1: スコープ
| スコープ | 説明 |
|---|---|
| グローバル | グローバル スコープは、Windows PowerShell プロンプト用です。 Windows PowerShell プロンプトで設定された変数は、その Windows PowerShell プロンプトで開始されたすべてのスクリプトで確認できます。 Windows PowerShell プロンプトで作成された変数は、他の Windows PowerShell プロンプトや、Windows PowerShell Integrated Scripting Environment (ISE) のインスタンスには存在しません。 |
| スクリプト | スクリプト スコープは 1 つのスクリプト用です。 スクリプト内で設定された変数は、そのスクリプト内のすべての関数で確認できます。 グローバル スコープに既に存在するスクリプト スコープに変数値を設定すると、スクリプト スコープに新しい変数が作成されます。 その場合、2 つの異なるスコープに同じ名前の 2 つの変数ができます。 この時点で、スクリプト内の変数の値を確認すると、スクリプト スコープ内の変数の値が返されます。 |
| 機能 | 関数スコープは、1 つの関数に対するスコープです。 関数内で設定された変数は、他の関数やスクリプトと共有されません。 グローバルまたはスクリプト スコープに既に存在する関数スコープに変数値を設定すると、関数スコープに新しい変数が作成されます。 その場合、2 つの異なるスコープに同じ名前の 2 つの変数ができます。 |
メモ
混乱を避けるために、異なるスコープで同じ変数名を使用しないようにすることをお勧めします。
より高いレベルのスコープで変数を確認するだけでなく、変数の変更時に変数のスコープを明確に参照することで、その変数を変更することもできます。 関数からスクリプト スコープ変数を変更するには、次の構文を使用します。
$script:var = "Modified from function"
これを行うと混乱が生じる可能性があるため、スコープ間で変数を変更することは避けるのがベスト プラクティスです。 代わりに、スクリプト スコープ変数を関数の出力と同じ値に設定します。 関数内のデータが変数内にある場合は、Return() を使用してスクリプトに渡すことができます。
関数の末尾で Return() を使用して変数値をスクリプト スコープに渡す例を次に示します。
Return($users)
メモ
関数で Return() を使用すると、返されるデータのパイプラインに指定したデータが追加されますが、パイプライン内の既存のデータは置き換えられません。 スクリプト開発の一環として、関数によって返されるデータを正確に確認する必要があります。