PowerShellでは、スコープは、スクリプト内のオブジェクト(変数、エイリアス、関数など)がグローバル環境に影響を与えないようにすることになっています。これはコマンドラインでは正常に機能するように見えますが、ISEでは機能しません。
コンソールのデモをご覧ください。$x
グローバルスコープで定義されていないことを確認し、その内容を表示してScopeTest.ps1
実行し、最後に$x
再度定義されているかどうかを確認します。予想どおり、$x
スクリプトのスコープ内でのみ作成および使用され、スクリプトの終了後はグローバル環境に保持されません。
ISEでは、コンソールウィンドウを使用してスクリプトが呼び出された場合、これは機能しているように見えます。
ただし、実際に「スクリプトを実行」ボタン、またはF5を使用すると、スクリプト内の変数は完了後も保持されます。
これにより、スクリプトがクリーンな環境から開始することを想定している場合、スクリプトの作成とトラブルシューティングが少し難しくなる可能性があります(つまり、スクリプト内に設定された変数はまだ存在しないはずです)。ISEがこのように動作するのはなぜですか?
この質問に対する答えは、「ドットソーシング」に言及しているトピックにほんの少し触れていますが、ここでより詳細な説明を取得したいと思っています。また、ISEでコンソールとは異なる方法でスクリプトが実行される理由に関するドキュメントが存在する場合は、リファレンスも参考になります。