Почему скриптовые командлеты перечислены как функции?

Если я создаю простую функцию Powershell, например

Function Hello {
    [CmdletBinding( )]
    Param (
        [parameter()]
        $Name
    )
    Begin{}
    Process{
        Write-Output "Hello $Name"
    }
    End{}
    }

затем используйте Get-Command, чтобы перечислить его с помощью Get-Command Hello, командлет указан как функция "CommandType". Почему он не указан в командлете CommandType?

При экспорте из модулей я также обнаружил, что мне нужно использовать FunctionToExport вместо CmdletsToExport.

Это не влияет на использование функций, мне просто интересно, почему они перечислены как это.

Ответ 1

Там потенциально не так много разницы между функцией и командлетом, но это зависит от того, сколько работы вы готовы записать в функцию. Дон Джонс написал статью о TechNet, когда они впервые выявили некоторые из этих различий.

Эти функции, написанные полностью в script, имеют те же возможности, что и "реальный" командлет, написанный на С# или Visual Basic и скомпилированный в Visual Studio. Эти расширенные функции (они изначально назывались командными командами script в начале цикла разработки v2) помогают вам писать более гибкие функции, которые затем можно легко использовать вместе с регулярными командлетами.

...

Реальная разница между простой функцией и полным командлетом заключается в том, что cmdlets поддерживают мощные привязки параметров. Вы можете использовать позиционные параметры, именованные параметры, обязательные параметры и даже выполнять проверки проверки основных параметров - все просто описывая параметр для оболочки.

Пример кода, который вы предложили, уже начинает размывать линии между ними, разрешая множество дополнительных параметров с помощью [CmdletBinding()] и начиная описывать новый параметр под названием $Name. Например, теперь вы можете использовать Write-Verbose в любой точке этой функции и вызывать флаг -Verbose для просмотра этих инструкций без необходимости выполнять дополнительную работу.

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