安装后导入PowerShell模块

安装后导入PowerShell模块,powershell,appfabric,appfabric-cache,Powershell,Appfabric,Appfabric Cache,我正在使用PowerShell自动化AppFabric安装,遇到了一个问题,脚本正在调用安装程序,等待安装完成,但无法从同一上下文导入安装的模块。i、 e: Start-Process "C:\provision\WindowsServerAppFabricSetup_x64.exe" -ArgumentList "/i /GAC" -Wait Import-Module DistributedCacheConfiguration # ...do configuration things...

我正在使用PowerShell自动化AppFabric安装,遇到了一个问题,脚本正在调用安装程序,等待安装完成,但无法从同一上下文导入安装的模块。i、 e:

Start-Process "C:\provision\WindowsServerAppFabricSetup_x64.exe" -ArgumentList "/i /GAC" -Wait
Import-Module DistributedCacheConfiguration
# ...do configuration things...
哪些错误:
未加载指定的模块“DistributedCacheConfiguration”,因为在任何模块目录中都找不到有效的模块文件。

如果关闭并重新打开PowerShell,脚本将正常运行。在安装程序和配置之间添加一个
Start Sleep 60
,没有任何帮助,因此我尝试调用它,好像powershell正在重新启动:

C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe C:\provision\appfabric_config.ps1

抛出了相同的错误。如何让PowerShell识别新安装的模块?

PowerShell在环境变量中列出的目录的子目录中查找模块。初始化会话时,从注册表项HKEY\U LOCAL\U MACHINE\System\CurrentControlSet\Control\Session Manager\Environment读取环境变量

如果安装程序将新模块放置在一个不在PSModulePath中的目录中,然后将该目录添加到环境变量中,则它是在注册表中修改环境变量,而不是在当前PowerShell控制台会话的环境中,因此,只有安装后启动的PowerShell会话才会更新PSModulePath

您可以通过在安装之后和尝试导入模块之前添加以下行,从注册表手动更新值:

$env:PSModulePath=(获取项目属性-路径'HKLM:\System\CurrentControlSet\Control\Session Manager\Environment'-Name PSModulePath).PSModulePath
请注意,尽管它可能显得多余,但您需要

(Get-ItemProperty-Path[…]-名称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

(实际上没有区别,只有六个或六个。)

您可以使用.NET System.Environment库访问环境变量。新模块很可能已添加到“用户”环境变量中。您还可以尝试指定“机器”和“过程”目标。有关更多信息,请参阅。下面是有关修改路径的详细信息,包括添加和删除条目。它可以很容易地适应PSModulePath环境变量

此示例将用户的PSModulePath环境变量添加到会话中PSModulePath环境变量的末尾。它将导致一些重复条目,但应该可以正常工作

$env:PSModulePath=$env:PSModulePath+”;'+[System.Environment]::GetEnvironmentVariable(“PSModulePath”、“User”)
您的代码现在如下所示:

启动进程“C:\provision\WindowsServerAppFabricSetup\u x64.exe”-ArgumentList”/i/GAC”-等待
$env:PSModulePath=$env:PSModulePath+';'+[System.Environment]::GetEnvironmentVariable(“PSModulePath”、“User”)
导入模块分布式缓存配置
#…做配置方面的事情。。。

模块安装在哪个文件夹中?是否在$env:psmodulepath中?它们安装在
C:\Program Files\AppFabric 1.1 for Windows Server\PowershellModules`中。如果
$env:psmodulepath`发生更改,如何“刷新”以获取最新值?这就是问题所在@Adi Inbar为您提供了更新$PSModulePath的方法