2013-08-27 6 views
11

単純なPowershell関数を作成すると、 Get-Command Helloでそれを一覧表示するには、Get-Commandコマンドを使用スクリプト化されたコマンドレットが関数として表示されるのはなぜですか?

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

はその後、コマンドレットは、 'CommandTypeを' 関数として表示されます。なぜ 'CommandType'コマンドレットとしてリストされていないのですか?

モジュールからエクスポートすると、CmdletsToExportの代わりにFunctionsToExportを使用する必要があることもわかりました。

機能の使用には影響していないようですが、なぜこのようにリストされているのか不思議です。

答えて

14

関数とコマンドレットの間に多少の違いはありませんが、関数を書くことにどのくらいの労力を要しているかによって異なります。 Don Jones wrote an article on TechNetが最初に出てきて、これらの違いのいくつかを強調しました。

これらの関数は、完全にスクリプトで記述され、C#またはVisual Basicで作成され、Visual Studioでコンパイルされた「実際の」コマンドレットと同じ機能を持ちます。これらの高度な機能(元々はv2開発サイクルの初めに「スクリプトコマンドレットレット」と呼ばれていました)は、より柔軟な機能を記述して、通常のコマンドレットと共にシームレスに使用できます。

...

単なる機能と完全なコマンドレットの間に実質的な違いは、コマンドレットは、強力なパラメータのバインドをサポートしていることです。位置パラメータ、名前付きパラメータ、必須パラメータ、および基本的なパラメータ検証チェックを使用することもできます。すべてのパラメータをシェルに記述するだけです。

すでに提供されてきたコード例では、[CmdletBinding()]を経由してほかのパラメータのホストを許可し、$Nameと呼ばれるブランドの新しいパラメータを記述するために開始することにより、両者の間の線をぼかすために開始します。たとえば、そのファンクションのどこにいてもWrite-Verboseを使用して、-Verboseフラグを呼び出して、追加の作業を行うことなくこれらのステートメントを参照できます。

機能的には、コンパイルされたコマンドレットまたはpowershellで書かれた関数の最終結果は、まったく異なる必要はありません。コンパイルされたコマンドレットとスクリプト化された関数を区別することが重要です。

関連する問題