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


12

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

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

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

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

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

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

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

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

この質問に対する答えは、「ドットソーシング」に言及しているトピックにほんの少し触れていますが、ここでより詳細な説明を取得したいと思っています。また、ISEでコンソールとは異なる方法でスクリプトが実行される理由に関するドキュメントが存在する場合は、リファレンスも参考になります。

回答:


9

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

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

関連する抜粋:

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

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

例えば:

Remove-Variable x

File-> New Powershell Tabをクリックして、Powershellの「クリーンな」インスタンスをISEに追加できます。


2

ISEでは、Powershellは基本的にスクリプトをシェルにダンプしてから実行します。シェルで入力したかのように実行します。そのため、そのセッションで変数を使用できます。他の違いを確認するには、このMSDNの投稿をご覧ください。


リンクされた投稿でこの動作に対処しているものは見当たりません。
イッツィ14

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.