Как Powershell знает, где найти модули для импорта? - PullRequest
0 голосов
/ 06 июля 2018

Я действительно на начальном уровне для работы с командлетами и PowerShell.Я вызываю командлеты из C #, используя PowerShell API.Я видел странное поведение.Находясь в разных потоках на stackoverfow, люди, явно импортирующие модули с помощью метода Import-Command или PSImportModule, я могу видеть, если уже есть сборка в $ env: PSModulePath, она автоматически загружается.Это поведение по умолчанию или из-за критериев конфигурации, которые я пропускаю.Я выполняю модульное тестирование в среде ms test.

Я использую следующий код.

 System.Management.Automation.PowerShell _powerShellInstance
 _powerShellInstance.AddCommand("Connect-AzureRmAccount", false);
 var output = _powerShellInstance.Invoke();

 // Invoking my commandlets

 _powerShellInstance.AddCommand("Get-LinkParameter", false); 

Приведенная выше команда автоматически загружает сборку из C:\Windows\system32\WindowsPowerShellModules\v1.0\Modules\.Я не создал ни пространства для выполнения, ни наборов конфигурации.Чуть выше автоматическая загрузка вещей.Мне нужно подтвердить, как именно ведет себя PowerShell и Run Space.Потому что мне нужно понять, как мне установить мои командлеты на производственной машине.Каким образом модульные тесты на производственной машине получат доступ к моим командлетам для полной загрузки.

1 Ответ

0 голосов
/ 06 июля 2018

Хотя рекомендуется явно загружать нужные модули с помощью Import-Module, поскольку Powershell 3.0, если модуль доступен в одном из мест, возвращаемых $env:PSModulePath, автоматически загружается, если один из его Командлеты вызываются. Ниже приводится разбивка различных путей:

Модули пользователя

$modulePath = "${env:UserProfile}\Documents\WindowsPowerShell\Modules" Установленные здесь модули доступны только для сеанса Powershell текущего пользователя, и по умолчанию модули, установленные с использованием Install-Module, сохраняются здесь.

Все пользовательские модули

$modulePath = "${env:ProgramFiles}\WindowsPowerShell\Modules" Установленные здесь модули доступны для любого пользовательского сеанса Powershell.

Системные модули

$modulePath = "${env:SystemRoot}\system32\WindowsPowerShell\v1.0\Modules" Установленные здесь модули доступны для всей системы для любого сеанса Powershell, но должны быть чистыми для управления Windows. Как правило, вы не хотите устанавливать свои собственные модули здесь.

Добавление дополнительных путей к модулям

Вы можете добавить дополнительные пути к $env:PSModulePath аналогично тому, как вы изменили бы переменную $env:PATH для разрешения исполняемых путей. Это просто строка каталогов, разделенная точкой с запятой ;, в которой находятся модули, и если модуль доступен по любому пути в $env:PSModulePath, Powershell будет знать, где его найти. И на самом деле вы можете видеть, что другие установленные инструменты, возможно, добавили свои собственные пути к $env:PSModulePath. Вот несколько примеров программ / наборов инструментов, которые делают это: Microsoft SQL Studio, Microsoft System Center - Operations Manager и Chef Development Kit.

Импорт модуля не по пути

Насколько я знаю, вы не можете загрузить модуль Powershell, который не является частью $env:PSModulePath. Однако вы можете временно отредактировать $env:PSModulePath, чтобы он содержал каталог с модулем, который вы хотите загрузить. Например, если вы хотите импортировать модуль с именем TestModule по произвольному пути:

$env:PSModulePath += ';C:\Path\To\Temporary\ModuleDirectory'
Import-Module TestModule

, где TestModule существует как прямая подпапка C:\Path\To\Temporary\ModuleDirectory

Вам не нужно отменять изменение пути модуля, когда вы готовы завершить сеанс Powershell, поскольку указанное выше изменение является временным. Следовательно, вам нужно будет модифицировать $env:PSModulePath в каждом сеансе, поэтому, если вы хотите, чтобы TestModule был постоянно доступным для использования, вы можете скопировать его в один из других каталогов в $env:PSModulePath или добавить постоянно C:\Path\To\Temporary\ModuleDirectory в переменную окружения PSModulePath.

Примечание о путях UNC

Вы также можете добавить UNC (сетевые) пути к $env:PSModulePath. Тем не менее, я полагаю, что любые сценарии удаленного модуля все еще будут зависеть от установленного в системе Powershell ExecutionPolicy.

...