Как перечислить все установленные, запускаемые командлеты в powershell? - PullRequest
2 голосов
/ 19 мая 2019

Я хочу перечислить все установленные, запускаемые командлеты и функции в powershell, но Get-Command перечисляет командлеты, которые каким-то образом «есть», но не загружены и не запускаются.

Например, Get-Command списки New-IseSnippet:

PS W:\> get-command "*-*" -CommandType Function,Cmdlet | where name -like "New-IseSnippet" | select name,module,path

Name           Module path
----           ------ ----
New-IseSnippet ISE

Похоже, у нас есть команда New-IseSnippet - давайте проверим ее:

PS W:\> get-command New-IseSnippet
get-command : The term 'New-IseSnippet' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that 
the path is correct and try again.
At line:1 char:1
+ get-command New-IseSnippet
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (New-IseSnippet:String) [Get-Command], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException,Microsoft.PowerShell.Commands.GetCommandCommand

Нет, мы можем запустить его?:

PS W:\> New-IseSnippet
New-IseSnippet : The 'New-IseSnippet' command was found in the module 'ISE', but the module could not be loaded. For more information, run 'Import-Module ISE'.
At line:1 char:1
+ New-IseSnippet
+ ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (New-IseSnippet:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CouldNotAutoloadMatchingModule

Нет.

Как получить только установленные, работающие команды?

Ответы [ 2 ]

1 голос
/ 28 мая 2019

К сожалению, как вы обнаружили, Обнаружение команд PowerShell, отображаемое Get-Command, может также включать команды, которые вы не можете запустить в сеансе .

Для этого есть веские и не очень веские причины:

  • (a) Команды из модулей, для которых требуется или может потребоваться другой PowerShell редакция все еще включена, единственное исключение составляют Windows в $PSHOME/Modules - модули в других каталогах в Windows и на Unix-подобных платформах все модули в $env:PSModulePath неизменносчитается совместимым - запись о модульном манифесте PSCompatibleEdition НЕ используется в PowerShell Core 6.2.1.

  • (b) В PowerShell Core 6.2.1 / Windows PowerShell v5.1, НЕТ способа ограничить модули поддерживаемыми платформами (ОС)

  • (c) Записи манифеста модуля PowerShellHostName и PowerShellHostVersion НЕ проверяются на совместимость dОбнаружение команды Uring для обеспечения совместимости хоста PowerShell - только при времени импорта модуля .

(a) является проектным решением (как минимумна данный момент), (b) еще не реализовано, но (c) - проблема, с которой вы столкнулись, - возможно, должна быть решена, поскольку ее легко выполнить. Я призываю вас запросить изменениев https://github.com/PowerShell/PowerShell/issues.

Вообще говоря, обнаружение команд должно быть ограничено проверкой модуля манифестов для определения совместимости;что-нибудь еще - попытка на самом деле загрузить каждого модуля - будет слишком затратным по времени и ресурсам.


Что добавляет путаницу, так это то, что Get-Command с литерал имя команды сообщает о вводящем в заблуждение сообщении об ошибке начиная с PowerShell Core 6.2.1 / Windows PowerShell v5.1:

В отличие от подстановочное выражение (например, *-*), имя команды literal (например, New-IseSnippet) заставляет Get-Command to неявно импортировать модуль команды, который являетсяокончательные тесты доступности команды в текущем сеансе - и это может терпеть неудачу .

К сожалению, способ, которым это терпит неудачу, обманчиво предполагает, что никакая такая команда не определена в то время как реальная проблема заключается в невозможности импортировать модуль , содержащий команду.

Прямой вызов той же команды более убедительно указывает на то, чтореальная проблема заключается в невозможности импорта мodule (хотя, возможно, он не должен просто говорить , что вам следует самостоятельно Import-Module запускать, чтобы узнать конкретную причину, а вместо этого сделать это для вас, а затем сообщить об этой причине).

1 голос
/ 19 мая 2019

Что касается этого корневого запроса ...

Я хочу перечислить все установленные, запускаемые командлеты и функции в * 1004 PowerShell *

... В моей личной библиотеке есть часть фрагмента, который я создал / собрал, давным-давно, и обновляю по мере необходимости, именно для этого варианта использования. В моем фрагменте есть гораздо больше , но это должно дать вам то, что вы хотите, согласно вашему посту. Это моя библиотека фрагментов кода в ISE / VSCode, я вызываю ее в любое время по мере необходимости, используя CTRL + J, выбирая ее в ISE и просто набирая справку в VSCode и выбирая ее.

# Get parameters, examples, full and Online help for a cmdlet or function

# Get a list of all Modules
Get-Module -ListAvailable | 
Out-GridView -PassThru -Title 'Available modules'

# Get a list of all functions
Get-Command -CommandType Function | 
Out-GridView -PassThru -Title 'Available functions'

# Get a list of all commandlets
Get-Command -CommandType Cmdlet | 
Out-GridView -PassThru -Title 'Available cmdlets'

# Get a list of all functions for the specified name
Get-Command -Name '*ADGroup*' -CommandType Function | 
Out-GridView -PassThru -Title 'Available named functions'

# Get a list of all commandlets for the specified name
Get-Command -Name '*ADGroup**'  -CommandType Cmdlet | 
Out-GridView -PassThru -Title 'Available named cmdlet'

# get function / cmdlet details
Get-Command -Name Get-ADUser -Syntax
(Get-Command -Name Get-ADUser).Parameters.Keys
Get-help -Name Get-ADUser -Full
Get-help -Name Get-ADUser -Online
Get-help -Name Get-ADUser -Examples

# Get parameter that accepts pipeline input
Get-Help Get-ADUser -Parameter * | 
Where-Object {$_.pipelineInput -match 'true'} | 
Select * 

# List of all parameters that a given cmdlet supports along with a short description:
Get-Help dir -para * | 
Format-Table Name, { $_.Description[0].Text } -wrap


# Find all cmdlets / functions with a target parameter
Get-Command -CommandType Function | 
Where-Object { $_.parameters.keys -match 'credential'} | 
Out-GridView -PassThru -Title 'Available functions which has a specific parameter'

Get-Command -CommandType Cmdlet | 
Where-Object { $_.parameters.keys -match 'credential'} | 
Out-GridView -PassThru -Title 'Results for cmdlets which has a specific parameter'

# Get named aliases 
Get-Alias | 
Out-GridView -PassThru -Title 'Available aliases'

# Get cmdlet / function parameter aliases
(Get-Command Get-ADUser).Parameters.Values | 
where aliases | 
select Name, Aliases | 
Out-GridView -PassThru -Title 'Alias results for a given cmdlet or function.'

### Query Powershell Data Types
[AppDomain]::CurrentDomain.GetAssemblies() | 
Foreach-Object { $_.GetExportedTypes() }

# Or 

[psobject].Assembly.GetType(“System.Management.Automation.TypeAccelerators”)::get

# Or

[psobject].Assembly.GetType("System.Management.Automation.TypeAccelerators")::Get.GetEnumerator() `
| Sort-Object -Property Key

<#
 Get any .NET types and their static methods from PowerShell. 
 Enumerate all that are currently loaded into your AppDomain.
#>  
[AppDomain]::CurrentDomain.GetAssemblies() | 
foreach { $_.GetTypes() } | 
foreach { $_.GetMethods() } | 
where { $_.IsStatic } | 
select DeclaringType, Name | 
Out-GridView -PassThru -Title '.NET types and their static methods'

Как уже отмечалось, есть вещи (не обязательно модули / командлеты всегда), которые являются только ISE (это что-то в модуле ISE или тому подобное, конечно) в зависимости от того, что вы делаете после / делаете, например, много вещей из формы, но до тех пор, пока вы добавляете соответствующие классы / типы форм в свой код, они также должны нормально работать в консоли.

Тем не менее, неправильно думать, что все, что помечено как ISE, когда-либо будет работать где-либо еще. Также есть много аддонов ISE. Вы можете получить к ним через меню дополнений ISE. Ничего из этого меню никогда не должно ожидаться на консоли. Например, это встроенный инструмент для непосредственного открытия текстовых файлов на вкладке редактора ISE, psEdit.

Get-Help -Name psedit

NAME
    psEdit

SYNTAX
    psEdit [-filenames] <Object>  [<CommonParameters>]


ALIASES
    None


REMARKS
    None

Попытка использовать это на хосте консоли не удастся, поскольку на хосте консоли такого редактора нет.

Вы также можете программно делать вещи в ISE, и, конечно, такого рода вещи никогда не будут работать в консоли.

Подробности здесь: Иерархия объектной модели ISE

Чтобы убедиться, что материал находится там, где он должен быть, когда вам это нужно, настройте свои профили PowerShell. Например вот пример того, что мой имеет в этом дело, когда я нахожусь в ISE против consolehost.

# Validate if in the ISE or not

If ($Host.Name -match 'ISE')
{
    Import-Module -Name PsISEProjectExplorer
    Import-Module -Name PSharp
    Import-Module -Name ClassExplorer

}

If ($Host.Name -notmatch 'ISE')
{ Import-Module -Name PSReadline }

Import-Module -Name PSScriptAnalyzer
Import-Module -Name Posh-SSH
Import-Module -Name ModuleLibrary -DisableNameChecking
Import-Module -Name Pester
Import-Module -Name PSKoans


If ($Host.Name -match 'ISE')
{
    #Script Browser Begin
    #Version: 1.3.2
    Add-Type -Path 'C:\Program Files (x86)\Microsoft Corporation\Microsoft Script Browser\System.Windows.Interactivity.dll'
    Add-Type -Path 'C:\Program Files (x86)\Microsoft Corporation\Microsoft Script Browser\ScriptBrowser.dll'
    Add-Type -Path 'C:\Program Files (x86)\Microsoft Corporation\Microsoft Script Browser\BestPractices.dll'
    $scriptBrowser = $psISE.CurrentPowerShellTab.VerticalAddOnTools.Add('Script Browser', [ScriptExplorer.Views.MainView], $true)
    $scriptAnalyzer = $psISE.CurrentPowerShellTab.VerticalAddOnTools.Add('Script Analyzer', [BestPractices.Views.BestPracticesView], $true)
    $psISE.CurrentPowerShellTab.VisibleVerticalAddOnTools.SelectedAddOnTool = $scriptBrowser
    #Script Browser End

    Set-StrictMode  -Version Latest 
}

Обновление для OP

Что касается…

Итак, есть ли способ запрашивать команды, которые на самом деле загружены и запускается в консоли powershell.exe (или pwsh.exe)?

Не в том смысле, что, как я понимаю, вы думаете. Похоже, у вас есть представление о том, какие командлеты загружаются при запуске. Это не вещь. командлеты выставляются загрузкой модуля и путями. Вы ожидаете, что PowerShell будет отображать только модули / командлеты / функции в зависимости от того, в какой версии / среде PowerShell вы находитесь. Это тоже не вещь. PowerShell будет иметь доступ ко всем .Net в вашей системе и ко всем указанным путям. Загружаете ли вы и используете их или нет, это другой вопрос.

Get-Module                # will show you all currently loaded ones.
Get-Module -ListAvailable # Will show all modules installed on your system.

Если вы используете PSv3 и выше, то все, что является вашей системной средой, и пути PowerShell всегда доступны, поскольку все, что вы вызываете в пути, будет автоматически загружаться при попытке его использовать.

Снова Get-Command выведет список всех доступных, они загружаются только при вызове одного из них и исчезают, когда вызов или сеанс завершены / закрыты, конечно.

Если у вас есть модули, командлеты / функции, которые не находятся в ожидаемых местах (пути среды или PS), то вам нужно либо добавить этот путь, либо использовать путь UNC для их запуска. Таким образом, все пути, полученные из любого UNC, всегда доступны. Если вы находитесь в ISE, вы можете увидеть это на вкладке Commands или в консоли с помощью Get-Command.

Вы можете временно добавлять пути на лету или использовать свои профили PowerShell или постоянно на лету, через свой профиль PowerShell или с помощью диалогового окна переменной среды Windows.

Хост-консоль и ISE всегда перечисляют любой модуль, командлет, функцию в ожидаемых путях. Они не означают, что все можно использовать. Как отмечалось, отдельные модули, командлеты и функции ISe будут работать в ISE только по понятным причинам. Тем не менее, ISE будет запускать любой модуль, командлет, функцию консоли хоста, кроме PSReadline. Хорошо это загрузит это, но это не будет ничего делать в консоли ISE. Консоль ISE - действительно выходные окна, не то же самое, что и consolehost. Ну, вы можете делать что-то вроде consolehost, но это не одно и то же.

Итак, модули загружены, модули предоставляют в них командлеты / функции. Не все модули загружаются по умолчанию, поэтому причина для двух команд выше, поэтому существуют Import-Module и auto load on call. PS Автономный персональный модуль / командлеты / функции / скрипты - это не то, о чем PS будет знать, пока вы не укажете, откуда они должны быть импортированы / загружены / использованы.

Если вас действительно интересуют подобные вещи, вы можете использовать командлет Trace-Command ...

Trace-Command

$A = "i*"
Trace-Command ParameterBinding {Get-Alias $Input} -PSHost -InputObject $A

DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [Get-Alias]
DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [Get-Alias]
DEBUG: ParameterBinding Information: 0 :     BIND arg [System.Object[]] to parameter [Name]
DEBUG: ParameterBinding Information: 0 :         Binding collection parameter Name: argument type [Object[]], parameter type [System.String[]], collection type 
Array, element type [System.String], no coerceElementType
DEBUG: ParameterBinding Information: 0 :         Arg is IList with 1 elements
DEBUG: ParameterBinding Information: 0 :         Creating array with element type [System.String] and 1 elements
DEBUG: ParameterBinding Information: 0 :         Argument type System.Object[] is IList
DEBUG: ParameterBinding Information: 0 :         Adding element of type String to array position 0
DEBUG: ParameterBinding Information: 0 :         BIND arg [System.String[]] to param [Name] SUCCESSFUL
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Get-Alias]
DEBUG: ParameterBinding Information: 0 : CALLING BeginProcessing
DEBUG: ParameterBinding Information: 0 : CALLING EndProcessing

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

Чем больше модулей вы устанавливаете, тем более доступными становятся командлеты / функции муара. Если вы действительно задумаетесь об этом на мгновение, это сотни модулей, и, следовательно, тысячи открытых командлетов / функций. Зачем вам все это загружать в память? Ваша система просто выйдет из строя из-за нехватки ресурсов. Поэтому загружайте только то, что вам действительно нужно, PowerShell будет вызывать только то, что ему нужно, когда это необходимо. Знайте, что является специфическим для ISE, и игнорируйте все это, если вы намереваетесь жить в хосте консоли или в ISE / VSCode и выполнять оболочку для хоста только тогда, когда это необходимо. Вот как я делаю вещи. Я редко, если когда-либо нужно идти на хост консоли для чего-либо. ISE мой по умолчанию, VSCode мой вторичный (пока). Есть те, кто какает на ИСЕ, я не из тех типов.

Обновление для OP

Что касается ...

Мой пример использования - не пользователь, сидящий за компьютером, а приложение NodeJS на котором работает хост powershell.exe (PS5) или pwsh.exe (PS6 / Core). я полностью понять, что модули могут быть «доступны», но не загружены, и это что я хочу запросить: какие командлеты / функции загружены (т.е. доступно для запуска сейчас без загрузки модуля). я нашел это странно / глючно, что Get-Command * будет отображать Cmdlet X, но Get-Command X дерьмо выйдет. Как я могу запросить команду: вы загружены работоспособным? PS: Google "Powowshell", чтобы увидеть мой проект.

Это помогло бы просто поставить ссылку на ваш проект вместо того, чтобы заставить меня искать его. 8 -} и тот факт, что он отображается только в Google, а не в другом движке, таком как DuckDuckGo или Bing, немного странный, ну да ладно.

Итак, вы имеете в виду эту коллекцию ---

http://cawoodm.blogspot.com https://github.com/cawoodm/powowshell.

Я посмотрю. Тем не менее, для того, что вам нужно, не используйте Get-Command отдельно. Используйте Get-Module совместно с Get-Command, чтобы перечислить командлеты / функции из этих загруженных модулей, чтобы приблизиться к тому, что вам нужно. Таким образом, в списке отображаются только загруженные модули и соответствующие командлеты / функции для этого сеанса.

# List all loaded session modules and the exposed cmdlets / functions in them
Get-Module -Name '*' | 
ForEach-Object { Get-Command -Module $PSItem }

# Results

 # List all loaded modules and the exposed cmdlets / functions in them
Get-Module -Name '*' | 
ForEach-Object { Get-Command -Module $PSItem }

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
... 
Cmdlet          Export-BinaryMiLog                                 1.0.0.0    CimCmdlets
Cmdlet          Get-CimAssociatedInstance                          1.0.0.0    CimCmdlets
Cmdlet          Get-CimClass                                       1.0.0.0    CimCmdlets
...
Cmdlet          Find-Member                                        1.1.0      ClassExplorer
Cmdlet          Find-Namespace                                     1.1.0      ClassExplorer
Cmdlet          Find-Type                                          1.1.0      ClassExplorer
...
Function        Get-IseSnippet                                     1.0.0.0    ISE
Function        Import-IseSnippet                                  1.0.0.0    ISE
Function        New-IseSnippet                                     1.0.0.0    ISE
Cmdlet          Add-Computer                                       3.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Add-Content                                        3.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Checkpoint-Computer                                3.1.0.0    Microsoft.PowerShell.Management                                   
...

Обновление для OP

Что касается ...

В вашем решении не будут перечислены командлеты / функции (например, ForEach-Object или Stop-Job), которые не имеют ассоциации модулей (64 в моей системе). Также, насколько вы уверены, что Get-Module возвращает только загруженные модули?

PowerShell получает командлеты и функции из источников и модулей PowerShell.

Если вы выполните поиск командлетов / функций, на которые вы указываете, вы увидите, откуда они здесь :

'ForEach-Object','Start-Job' | 
    ForEach{
                Get-Command -CommandType Cmdlet -Name $PSItem | 
                Format-Table -AutoSize
           }

<#
CommandType Name           Version Source                   
----------- ----           ------- ------                   
Cmdlet      ForEach-Object 3.0.0.0 Microsoft.PowerShell.Core



CommandType Name      Version Source                   
----------- ----      ------- ------                   
Cmdlet      Start-Job 3.0.0.0 Microsoft.PowerShell.Core
#>

Таким образом, базовые командлеты / функции не относятся к усилиям модуля импорта. Там как раз там по замыслу в установке OS / .Net.

Таким образом, мое решение не является ошибкой, и я никогда не говорил, что оно даст вам 100% при использовании этого. Это был способ показать вам, какие модули загружаются для использования, что Командлеты / функции, и это не имеет ничего общего с тем, что Microsoft.PowerShell.Core, .Net в целом и / или с какой версией ОС позволяет (Cmdlets / Functions / Modules также являются специфичными для ОС и $ PSVersion, как мы все знаем).

Итак, опять же, ваш вариант использования того, что вы пытаетесь разработать, недействителен. Командлеты и функции независимо от источника не загружаются и не готовы к использованию. Они установлены или выставлены и доступны для использования, когда вам нужно позвонить им через вышеупомянутые. Они никогда не загружаются (сохраняются в памяти) до тех пор, пока вы их не вызовете, и больше ничего в GAC не существует.

Итак, глядя на ваш проект, я вижу, что вы пытаетесь сделать, но вы пытаетесь думать за пользователя. Точно так же, как вы, как разработчик, должны ссылаться на сборку из GAC (которая содержит тысячи вещей, которые есть, но не загружены, пока вы не ссылаетесь на них), и вы должны знать, где она и какую вы хотите использовать, и Зачем. Таким образом, то же самое относится к тому, к чему может иметь доступ PowerShell. Обратите внимание, я сказал, доступ, а не можете ли вы использовать его или нет в сеансе PowerShell.

Итак, если мы вступим в это, мы получим ...

Cmdlets / Function come from. The OS (DLLs), [.Net][4], [Core module][3], and those exported from the modules you Import.

Итак, опять же, вы подумали, что доступно или доступно при импорте модулей или DLL. Импортированные модули и связанные с ними командлеты / функции могут не работать в зависимости от типа сеанса, в котором вы находитесь. Значение, ISE против consolhost.

К вашему сведению, вы должны расширить свой взгляд на это ...

В ИСЕ

# Total host available commands cmdlet / Functions regadless where the come from
(Get-Command).Count
8750
# Total host avaialble cmdlets
(Get-Command -CommandType Cmdlet).Count
4772
# Total host available functions
(Get-Command -CommandType Function).Count
3035

# Difference of host available cmdlets / functions not shown that are part of the previous two calls.
(Get-Command).Count - ((Get-Command -CommandType Cmdlet).Count + (Get-Command -CommandType Function).Count)
943

# Further breakdown
(Get-Command -CommandType Alias).Count
1446
(Get-Command -CommandType Application).Count
937
(Get-Command -CommandType Configuration).Count
# The property 'Count' cannot be found on this object. Verify that the property exists.
(Get-Command -CommandType ExternalScript).Count
2
(Get-Command -CommandType Script).Count
# The property 'Count' cannot be found on this object. Verify that the property exists.
(Get-Command -CommandType Filter).Count
2
(Get-Command -CommandType Workflow).Count
# The property 'Count' cannot be found on this object. Verify that the property exists.
(Get-Command -CommandType All).Count
10219


# Get a list of all Modules
(Get-Module -ListAvailable).Count
387

# Get a list of all loaded Modules
(Get-Module).Count
12

# List all loaded session modules and the exposed cmdlets / functions in them
(Get-Module -Name '*' | 
ForEach-Object { Get-Command -Module $PSItem }).Count
505

(Get-Module -ListAvailable | 
ForEach {
    Get-Module -Name $PSItem.Name | 
    ForEach-Object { Get-Command -Module $PSItem }
}).Count
669



# If I Import another 3rdP module I installed from the gallery, things will change of course

Import-Module -Name ShowUI

# Get a list of all Modules
(Get-Module -ListAvailable).Count
387

# Get a list of all loaded Modules
(Get-Module).Count
13

# List all loaded session modules and the exposed cmdlets / functions in them
(Get-Module -Name '*' | 
ForEach-Object { Get-Command -Module $PSItem }).Count
937

(Get-Module -ListAvailable | 
ForEach {
    Get-Module -Name $PSItem.Name | 
    ForEach-Object { Get-Command -Module $PSItem }
}).Count
1101

В консоли хоста - обратите внимание на различия

# Total host available commands cmdlet / Functions regadless where the come from
(Get-Command).Count
9191

# Total host avaialble cmdlets
(Get-Command -CommandType Cmdlet).Count
4772

# Total host available functions
(Get-Command -CommandType Function).Count
3472

# Difference of host available cmdlets / functions not shown that are part of the previous two calls.
(Get-Command).Count - ((Get-Command -CommandType Cmdlet).Count + (Get-Command -CommandType Function).Count)
947


# Further breakdown
(Get-Command -CommandType Alias).Count
1809

(Get-Command -CommandType Application).Count
937

(Get-Command -CommandType Configuration).Count
0
# The property 'Count' cannot be found on this object. Verify that the property exists.
(Get-Command -CommandType ExternalScript).Count
2

(Get-Command -CommandType Script).Count
0
# The property 'Count' cannot be found on this object. Verify that the property exists.
(Get-Command -CommandType Filter).Count
1

(Get-Command -CommandType Workflow).Count
1
# The property 'Count' cannot be found on this object. Verify that the property exists.
(Get-Command -CommandType All).Count
10994




# Get a list of all Modules
(Get-Module -ListAvailable).Count
387

# Get a list of all loaded Modules
(Get-Module).Count
8

# List all loaded session modules and the exposed cmdlets / functions in them
(Get-Module -Name '*' | 
ForEach-Object { Get-Command -Module $PSItem }).Count
467

(Get-Module -ListAvailable | 
ForEach {
    Get-Module -Name $PSItem.Name | 
    ForEach-Object { Get-Command -Module $PSItem }
}).Count
623



# If I Import another 3rdP module I installed from the gallery, things will change of course

Import-Module -Name ShowUI

# Get a list of all Modules
(Get-Module -ListAvailable).Count
387


# Get a list of all loaded Modules
(Get-Module).Count
9


# List all loaded session modules and the exposed cmdlets / functions in them
(Get-Module -Name '*' |
ForEach-Object { Get-Command -Module $PSItem }).Count
899


(Get-Module -ListAvailable |
ForEach {
    Get-Module -Name $PSItem.Name |
    ForEach-Object { Get-Command -Module $PSItem }
}).Count
1055
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...