Как установить модуль в пользовательский каталог?

В настоящее время мы устанавливаем некоторые модули с помощью команды ниже, но она устанавливает модули в 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 ответа

Вы можете скачать модуль zip вручную, используя Save-Module команда.

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 Командлет.


Если вы используете 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'

Чтобы получить контроль над путем установки модуля, вам необходимо прекратить использование -Scopeфлаг. Если вы не укажете область действия, местом установки по умолчанию будет первый путь, возвращаемый из $env:PSModulePathпеременная окружения. Если вы измените эту переменную непосредственно в скрипте, она будет сохраняться только для вашего сеанса. Это может быть идеально для того, что вы делаете.

Сначала добавьте свой собственный путь в качестве первого элемента в переменной:

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

Затем, когда вы запустите свою установку, она будет использовать этот путь:

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

Затем вы можете при желании сделать этот параметр постоянным:

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

Как описано в Microsoft Doc.

$env:PSModulePath - это переменная окружения, которая используется для поиска модулей, когда вы делаете Import-Module а также сделать автоматическую загрузку модуля с PS V3 и далее.

если вы идете я через файл справки для Install-Module Я не вижу опции для указания пути установки для модуля.

Таким образом, в качестве обходного пути, вы можете создать задание на копирование на основе имени модуля (то же самое будет и имя папки для каждого модуля).

С Уважением,

Kvprasoon

Другие вопросы по тегам