如何将模块安装到自定义目录?

时间:2017-02-27 14:32:37

标签: powershell powershell-module powershellget

目前我们正在使用以下命令安装一些模块,但它会在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

3 个答案:

答案 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

相关问题