Процесс обнаружения модуля PowerShell

Объяснение

В 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

person Igor    schedule 05.11.2020    source источник
comment
Можете ли вы вставить вывод из $env:PSModulePath -split ';' в свой пост?   -  person Mathias R. Jessen    schedule 05.11.2020
comment
Я добавил запрошенную информацию.   -  person Igor    schedule 05.11.2020
comment
И добавил дополнительную информацию о путях.   -  person Igor    schedule 05.11.2020
comment
Похоже, вы только что ответили на свой вопрос, пути к папкам, содержащим модули расширения управления секретами ExpressRoute и Az.KeyVault, не указаны в переменной PSModulePath env. AppLocker скорее всего не отображается, потому что PowerShell 7 не может его загрузить (я не удивлюсь, если он жестко зависит от библиотеки .NET Framework)   -  person Mathias R. Jessen    schedule 05.11.2020
comment
Хм, этот найден C:\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.2020
comment
И, просто чтобы быть ясным. У меня есть список из 46 различных манифестов модулей в $PSModulePaths, которые не перечислены с Get-Module. Я не ищу объяснений по этим конкретным модулям, а скорее как какой-то общий обзор и, желательно, некоторую общедоступную документацию по ним.   -  person Igor    schedule 05.11.2020
comment
Возможно, это лучшее объяснение, которое я знаю   -  person Mathias R. Jessen    schedule 05.11.2020
comment
Я думаю, что эта статья поможет вам, stackoverflow.com/questions/51207167/   -  person Shaqil Ismail    schedule 06.11.2020