一連の自己記述モジュール (psm1) を参照する、非常に単純な PS スクリプトがあります。PowerShell ISE からスクリプトを実行すると、モジュールの最新バージョンが実行されないため (ただし、いくつかの古いバージョンのメモリに保存されているため)、髪を引っ張ることがよくあります。
私はgoogle-d、google-dを持っていて、読んで試してみましたが、これらの問題を常に回避するのではなく、一体何が起こっているのかを理解したいと思う時が来ました.
いくつかのサンプルコード:
(スクリプトは、マシンで機能する PC を構成し、共有を設定し、ローカル ユーザーを作成し、NIC を構成します)
次のように、モジュールの場所をモジュールパスに追加することから始めます。
# Make sure .\Modules is part of the PSModulePath environment variable
$currentPSModulePath = [Environment]::GetEnvironmentVariable("PSModulePath", "Machine")
If (-Not ($currentPSModulePath -Like '*.\Modules*'))
{
[Environment]::SetEnvironmentVariable("PSModulePath", $currentPSModulePath + ";.\Modules", "Machine")
}
Write-Host ("Environment variable for PSModulePath = {0}" -f [Environment]::GetEnvironmentVariable("PSModulePath", "Machine"))
次に、必要なモジュールをロードします。
### Import Modules
Import-Module -DisableNameChecking ConfigureSystemPC
Import-Module -DisableNameChecking ConfigureChipPC
Import-Module -DisableNameChecking ConfigureEngravePC
Import-Module -DisableNameChecking ConfigureCInkPC
Import-Module -DisableNameChecking ConfigureIPPC
Import-Module -DisableNameChecking ConfigureNPPC
最後に、どの PC を構成する必要があるかをユーザーに尋ねます。
### Start configuring new PC ###
Write-Host "`nChoose the PC type form the options below:`n"
Write-Host "1. System PC"
Write-Host "2. Chip PC"
Write-Host "3. Engrave PC"
Write-Host "4. CInkjet PC"
Write-Host "5. IP PC"
Write-Host "6. NP PC"
Write-Host "7. Output PC"
$pcType = Read-Host "Please enter the PC type and press [enter]"
Write-Host ("You choose option: {0}" -f $pcType)
switch ($pcType)
{
1 { Configure-SystemPC }
2 { Configure-ChipPC }
3 { Configure-EngravePC }
4 { Configure-CInkPC }
5 { Configure-IPPC }
6 { Configure-NPPC }
7 { Configure-OutputPC }
}
Configure-モジュールで何かを変更すると、問題が発生します。(eg) を追加Write-Host "bla bla"
して [保存] ボタンを押し、メイン スクリプト (上記のスクリプト) を再度デバッグすると、PowerShell は古いバージョンのモジュールを実行します。
次のいずれかでモジュールをリロードしない限り:
rmo Configure-EngravePC
に続くipmo Configure-EngravePC
ipmo Configure-EngravePC -Force
モジュールのまったく同じ「古い」バージョンが実行されます。
これに通常対処する方法を誰が教えてくれますか? そして、なぜ、なぜ、なぜ、デバッガーを介してスクリプトを実行するときに、モジュールをリロードする必要があるのでしょうか? 別のセッションで実行されたモジュールを「保存」するのはなぜですか?? 私は何か間違ったことをしていますか?
事前に多くの感謝を申し上げます。誰かがこれについて詳しく説明してくれることを願っています。
適切な説明(またはこのトピックに関する適切なドキュメントへの参照)を含む回答を強く好みます