10

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

4

3 回答 3

11

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'
于 2018-10-10T11:06:12.797 回答
0

为了控制模块安装路径,您需要停止使用-Scope标志。当您不指定范围时,默认安装位置是从$env:PSModulePath环境变量返回的第一个路径。如果您直接在脚本中修改此变量,它只会在您的会话中持续存在。这可能是您正在做的事情的理想选择。

首先,将您的自定义路径添加为变量中的第一项:

$env:PSModulePath = "E:\Modules;" + $env:PSModulePath

然后,当您运行安装时,它将使用该路径:

Install-Module -Name XXX -RequiredVersion XXX -Repository XXX

然后,您可以选择使该设置永久化:

[Environment]::SetEnvironmentVariable("PSModulePath", $env:PSModulePath)

Microsoft Doc中所述。

于 2021-05-14T16:13:44.277 回答
-1

$env:PSModulePath 是一个环境变量,用于在您搜索模块时搜索模块,Import-Module以及从 PS V3 开始自动加载模块。

如果您浏览帮助文件Install-Module,我看不到为模块提供安装路径的选项。

因此,作为一种解决方法,您可以根据模块名称(每个模块的文件夹名称相同)复制作业到您的自定义路径。

问候,

Kvprasoon

于 2017-02-28T03:21:25.447 回答