我有一个非常简单的 PS 脚本,它指的是一堆自写模块(psm1)。当我从 PowerShell ISE 运行我的脚本时,我经常把我的头发拉出来,因为我的模块的最新版本没有被执行(但是一些过时的-somewhere-stored-in-memory-version)。
我有 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 }
}
当我更改配置模块中的某些内容时,问题就出现了。当我简单地添加 (eg) Write-Host "bla bla"
,按下保存按钮,并再次调试我的主脚本(如上所示的脚本),PowerShell 将运行旧版本的模块。
除非我通过以下任一方式重新加载模块:
rmo Configure-EngravePC
其次是ipmo Configure-EngravePC
ipmo Configure-EngravePC -Force
我的模块的完全相同的“旧”版本将被执行。
谁能指出我通常如何处理这个问题?为什么,为什么,为什么,当我通过调试器运行我的脚本时,我什至必须重新加载模块?为什么它会“存储”在不同会话中运行的模块?难道我做错了什么?
非常感谢,我希望有人能详细说明这一点,我经常卡住..
我非常喜欢有适当解释的答案(或参考有关此主题的良好文档)