Объяснение
В PowerShell
команда Get-Module -ListAvailable
должна дать вам (MS Docs link) все модули по путям, указанным в переменной окружения $PSModulePath
. Но это не полная история. Пока я понял, что имя каталога, в котором находится манифест модуля, должно совпадать с именем модуля. При желании он может включать версию в качестве дополнительного уровня папки.
Например, эти модули возвращаются:
C:\Program Files\WindowsPowerShell\Modules\Azure.Storage\4.6.0\Azure.Storage.psd1
C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\NetTCPIP\NetTCPIP.psd1
Даже это не полная история. У меня есть эти модули на моем компьютере, расположенные в списке каталогов в $PSModulePath
, но они не отображаются в результатах Get-Module -ListAvailable
.
Но эти манифесты модулей не перечислены как доступные модули:
C:\Users\iiric\Documents\PowerShell\Modules\Az.KeyVault\2.1.0\SecretManagementExtension\SecretManagementExtension.psd1
C:\Program Files\WindowsPowerShell\Modules\Azure\5.1.2\ExpressRoute\ExpressRoute.psd1
C:\Windows\System32\WindowsPowerShell\v1.0\Modules\AppLocker\AppLocker.psd1
Обратите внимание, что это не связано с путями. Я возвращаю модуль Az.KeyVault версии 2.1.0 просто отлично.
Вопрос
Как именно работает обнаружение модулей в PowerShell? Описано ли это где-то более технически подробно?
Дополнительные подсказки
Основываясь на анализе исходного кода, я увидел некую фильтрацию результатов по версии и другим свойствам.
Кроме того, я подозреваю, что Get-Module
как только он находит какой-то модуль, он не выполняет поиск внутри его подкаталогов. Однако мне не удалось найти это документально.
PSModulePath
PS > $env:PSModulePath -split ';'
C:\Users\iiric\Documents\PowerShell\Modules
C:\Program Files\PowerShell\Modules
c:\program files\powershell\7\Modules
C:\Program Files\WindowsPowerShell\Modules
C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules
C:\Program Files\Microsoft System Center 2012 R2\Virtual Machine Manager\bin\psModules\
C:\Program Files (x86)\Windows Kits\10\Microsoft Application Virtualization\Sequencer\AppvPkgConverter
C:\Program Files (x86)\Windows Kits\10\Microsoft Application Virtualization\Sequencer\AppvSequencer
C:\Program Files (x86)\Microsoft Azure Information Protection\Powershell
c:\Users\iiric\.vscode-insiders\extensions\ms-vscode.powershell-2020.6.0\modules
$env:PSModulePath -split ';'
в свой пост? - person Mathias R. Jessen   schedule 05.11.2020ExpressRoute
иAz.KeyVault
, не указаны в переменнойPSModulePath
env.AppLocker
скорее всего не отображается, потому что PowerShell 7 не может его загрузить (я не удивлюсь, если он жестко зависит от библиотеки .NET Framework) - person Mathias R. Jessen   schedule 05.11.2020C:\Users\iiric\Documents\PowerShell\Modules\Az.KeyVault\2.1.0\Az.KeyVault.psd1
, но этого нетC:\Users\iiric\Documents\PowerShell\Modules\Az.KeyVault\2.1.0\SecretManagementExtension\SecretManagementExtension.psd1
Технически, они оба находятся подC:\Users\iiric\Documents\PowerShell\Modules
- person Igor   schedule 05.11.2020Get-Module
. Я не ищу объяснений по этим конкретным модулям, а скорее как какой-то общий обзор и, желательно, некоторую общедоступную документацию по ним. - person Igor   schedule 05.11.2020