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