PowerShell ISE がスクリプト変数をスクリプト スコープに分離しないのはなぜですか?

PowerShell ISE がスクリプト変数をスクリプト スコープに分離しないのはなぜですか?

PowerShell では、スコープはスクリプト内のオブジェクト (変数、エイリアス、関数など) がグローバル環境に影響を与えないようにするためのものです。これはコマンド ラインでは正常に機能するようです。しかし、ISE では機能しません。

$xコンソールでのデモを以下に示します。 がグローバル スコープで定義されていないことを確認し、 の内容を表示しScopeTest.ps1てから実行し、最後に が再度定義されているかどうかを確認します$x。 予想どおり、$xはスクリプトのスコープ内でのみ作成および使用され、スクリプトが終了した後はグローバル環境に保持されません。

ここに画像の説明を入力してください

ISE では、コンソール ウィンドウを使用してスクリプトが呼び出されると、これが機能するようです。

ここに画像の説明を入力してください

ただし、実際に「スクリプトを実行」ボタンまたは F5 を使用すると、スクリプト内の変数は完了後も保持されます。

ここに画像の説明を入力してください

スクリプトがクリーンな環境から開始されることを前提としている場合 (つまり、スクリプト内で設定された変数がまだ存在していないこと)、スクリプトの作成とトラブルシューティングが少し難しくなる可能性があります。ISE がこのように動作する理由は何でしょうか?

答えこの質問このトピックについては「ドットソース」について少し触れていますが、ここではより詳しい説明が得られることを期待しています。また、スクリプトがコンソールからではなく ISE で異なる方法で実行される理由に関するドキュメントが存在する場合は、参照も必要です。

答え1

スクリプトの例では、変数を作成しましたが、スクリプトの最後でそれらを破棄しませんでした。ISE は、実行をクリックするとスクリプトをロードして実行する PowerShell のライブ インスタンスを作成します。違いは、統合シェルはスクリプトを続行できることです。これは、環境をデバッグしたり、スクリプトを作成したりするのに最適です。この方法により、次のコード行が機能することを確認するためにスクリプトを何度も実行し続ける必要がなくなります (これが理想的でない状況もあります)。シェルに入力し、機能する場合はスクリプト セクションに追加します。

この動作は、おそらく次のように最もよく説明されます。 http://technet.microsoft.com/en-us/library/dd819480.aspx

関連する抜粋:

ISE 内のすべてのペインは常に同じスコープ内にあります。

スクリプトが完了した後も変数をシェル内に残したくない場合は、Remove-Variableそうする必要があります。

例えば:

Remove-Variable x

「ファイル」->「新しいPowershellタブ」をクリックすると、ISEにPowerShellの「クリーン」インスタンスを追加できます。

答え2

ISE Powershellでは、基本的にスクリプトをシェルにダンプして実行します。シェルで入力して実行したのと同じです。そのため、変数はそのセッションで使用できます。他の違いを確認するには、こちらを参照してください。マイクロソフト役職。

答え3

そのため、ISE はグローバルとしてスコープ設定されます。ISE で作業中に作成されたすべての変数を削除しない限り、スクリプトの実行後にすべての変数が使用可能になります。ISE を使用してスクリプトを作成するときは、常に別の PowerShell コンソールを開いてテストします。これにより、すべてが意図したとおりに機能することを確認できます。

関連情報