5

Windows Server 2008r2 で 64 ビットの Powershell ISE を実行しています。

デバッグ中に、次のような変数を設定しました。

$dbName = "db1"

次に、次の変更を行います

$dbName = "db2"

もう一度スクリプトをステップ実行すると、デバッガーが修正された行をステップオーバーしても、$dbName 変数にカーソルを合わせると、まだ "db1" の値が表示されます。これを回避できる唯一の方法は、その ISE を再起動することです。これは面倒です。

どこが間違っているのか教えてもらえますか?

* アップデート *

モジュールに次の機能があります。

Function SampleFunction()
{
    $dbName = "db1"
    write-host $dbName
}

moduleLをインポートするpowershellスクリプトがあります

Import-Module -Name ".\BadPsm.psm1"

PowerShell ISE から、実行ウィンドウに「SampleFunction」と入力して関数を実行する前に、$dbName = "db1" にブレークポイントを配置します。すべて問題なく、値「db1」が出力ウィンドウに書き込まれます。

次に、$dbName = "db2" になるように関数を変更します。Import-Module -Name ".\BadPsm.psm1" を再度実行して、モジュールを再インポートします。

関数を再度実行すると、ブレークポイントに到達し、ステップ オーバーして、$dbName がまだ "db1" に等しいことがわかります。"db1" も出力ウィンドウに書き込まれます。

わかりやすくするために、短いスクリーンキャストを YouTube に投稿しました: YouTube リンク

4

2 に答える 2

6

ビデオは、モジュールを変更した後、 import-module を再度呼び出す前にモジュールをアンロードしなかったことを示しています。同じモジュールに対して Import-Module を 2 回呼び出しても、既に読み込まれているため何も実行されません。そのため、古い関数の結果が表示されます。

解決策は、Import-Module をもう一度呼び出す前に、Remove-Module を呼び出すことです。または、Import-Module の -Force パラメーターを使用して再読み込みを強制します。

Import-Module -Name ".\BadPsm.psm1" -Force

PowerShell ISE を終了すると役立つ理由は、最初からやり直すためです。PowerShell ISE とは関係ありません。この効果は、PowerShell コンソールでも確認できます。

他の人が試してみて、あなたが見ているものを再現できない理由は、モジュールを使用していないため、コードを変更するたびに、変更されたコードが実行されるためです。

于 2014-01-03T15:46:36.980 に答える