目前我们正在使用以下命令安装一些模块,但它会在C:\Program Files\WindowsPowerShell\Modules
中安装模块。
Install-Module -Name XXX -RequiredVersion XXX -Repository XXX -Scope AllUsers
我们的要求是将此模块安装在E:\Modules
文件夹中。为此,我更新了PSModulePath
环境变量,如下所示。 (https://msdn.microsoft.com/en-us/library/dd878350(v=vs.85).aspx)
$p = [Environment]::GetEnvironmentVariable("PSModulePath")
$p += ";E:\Modules"
[Environment]::SetEnvironmentVariable("PSModulePath",$p)
但它仍安装在C:\Program Files\WindowsPowerShell\Modules
。
如何在安装模块之前将PSModulePath
更新为E:\Modules
?
答案 0 :(得分:1)
您可以使用Save-Module
命令手动下载模块zip。
Find-Module -Name 'XXX' -Repository 'PSGallery' | Save-Module -Path 'E:\Modules'
您可以从此处使用完全限定的名称导入模块,如下所示:
Import-Module -FullyQualifiedName 'E:\Modules\XXX'
或者像以前一样将目标文件夹添加到PSModulePath
。
$modulePath = [Environment]::GetEnvironmentVariable('PSModulePath')
$modulePath += ';E:\Modules'
[Environment]::SetEnvironmentVariable('PSModulePath', $modulePath)
然后您可以使用Get-Module
cmdlet检查模块是否已导入。
如果使用Import-Module
命令,可能会有些痛苦,尤其是在有很多模块的情况下。因此,您可以将这种方法包装在这样的函数中:
function Install-ModuleToDirectory {
[CmdletBinding()]
[OutputType('System.Management.Automation.PSModuleInfo')]
param(
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
$Name,
[Parameter(Mandatory = $true)]
[ValidateScript({ Test-Path $_ })]
[ValidateNotNullOrEmpty()]
$Destination
)
# Is the module already installed?
if (-not (Test-Path (Join-Path $Destination $Name))) {
# Install the module to the custom destination.
Find-Module -Name $Name -Repository 'PSGallery' | Save-Module -Path $Destination
}
# Import the module from the custom directory.
Import-Module -FullyQualifiedName (Join-Path $Destination $Name)
return (Get-Module)
}
Install-ModuleToDirectory -Name 'XXX' -Destination 'E:\Modules'
答案 1 :(得分:1)
为了控制模块安装路径,您需要停止使用 -Scope
标志。 当您不指定范围时,默认安装位置是从 $env:PSModulePath
环境变量返回的第一个路径。如果您直接在脚本中修改此变量,它只会在您的会话中持续存在.这可能是您正在做的事情的理想选择。
首先,将您的自定义路径添加为变量中的第一项:
$env:PSModulePath = "E:\Modules;" + $env:PSModulePath
然后当您运行安装时,它将使用该路径:
Install-Module -Name XXX -RequiredVersion XXX -Repository XXX
然后您可以选择将该设置永久化:
[Environment]::SetEnvironmentVariable("PSModulePath", $env:PSModulePath)
如Microsoft Doc中所述。
答案 2 :(得分:0)
$ env:PSModulePath是一个环境变量,用于在执行Import-Module
时搜索模块,也可以从PS V3开始执行模块自动加载。
如果您浏览Install-Module
的帮助文件,我看不到为模块提供安装路径的选项。
因此,作为一种变通方法,您可以根据自定义路径的模块名称(每个模块的文件夹名称相同)进行复制作业。
此致
Kvprasoon