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