我正在使用PowerShell自动化AppFabric安装,我遇到了脚本调用安装程序,等待它完成的问题,但是我无法导入已安装的模块在相同的背景下。即:
Start-Process "C:\provision\WindowsServerAppFabricSetup_x64.exe" -ArgumentList "/i /GAC" -Wait
Import-Module DistributedCacheConfiguration
# ...do configuration things...
哪些错误:The specified module 'DistributedCacheConfiguration' was not loaded because no valid module file was found in any module directory.
如果您关闭并重新打开PowerShell,脚本运行正常。在安装程序和配置之间添加Start-Sleep 60
没有帮助,所以我尝试调用它,好像PowerShell正在重新启动:
C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe C:\provision\appfabric_config.ps1
抛出了同样的错误。如何让PowerShell识别新安装的模块?
答案 0 :(得分:7)
PowerShell在 PSModulePath 环境变量中列出的目录的子目录中查找模块。初始化会话时,将从注册表项 HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environment 中读取环境变量。
如果安装程序将新模块放在 PSModulePath 中的目录中,然后将该目录添加到环境变量中,则会修改环境变量。注册表,不在当前的PowerShell控制台会话环境中,因此只有在安装后启动的PowerShell会话才会有更新的 PSModulePath 。
您可以通过在安装后和尝试导入模块之前添加以下行来手动更新注册表中的值:
$env:PSModulePath = (Get-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Session Manager\Environment' -Name PSModulePath).PSModulePath
请注意,虽然它可能看起来多余,但您需要
(Get-ItemProperty -Path [...] -Name PSModulePath).PSModulePath
而不仅仅是
Get-ItemProperty -Path [...] -Name PSModulePath
是 Get-ItemProperty 没有返回指定注册表值的数据,它返回一个PSCustomObject,其中包含有关注册表值的信息,并且数据属于该属性具有注册表值名称的PSCustomObject(在本例中为 PSModulePath )。如果您愿意,也可以这样做:
$env:PSModulePath = Get-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Session Manager\Environment' -Name PSModulePath | select -ExpandProperty PSModulePath
(没有实际的区别,它有六个半打。)
答案 1 :(得分:0)
您可以使用.NET System.Environment库来访问您的环境变量。您的新模块很可能已添加到“用户”环境变量中。您还可以尝试指定“机器”和“处理”目标。有关详细信息,请参阅Environment.GetEnvironmentVariable。以下是修改路径的good article,包括添加和删除条目。它可以很容易地适应PSModulePath环境变量。
此示例将User的PSModulePath环境变量添加到会话中PSModulePath环境变量的末尾。它会导致一些重复的条目,但应该可以正常工作。
$env:PSModulePath = $env:PSModulePath+';'+[System.Environment]::GetEnvironmentVariable("PSModulePath","User")
您的代码现在看起来像这样:
Start-Process "C:\provision\WindowsServerAppFabricSetup_x64.exe" -ArgumentList "/i /GAC" -Wait
$env:PSModulePath = $env:PSModulePath+';'+[System.Environment]::GetEnvironmentVariable("PSModulePath","User")
Import-Module DistributedCacheConfiguration
# ...do configuration things...