2013-08-27 3 views
11

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

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

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

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

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

ответ

14

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

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

...

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

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

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