One Step Ahead

プログラミングやエンジニアリング全般について書いていきます

Powershellのコマンドレット(Cmdlet)と関数(Function)

はじめに


PowerShellを使う上で、何となく腑に落ちない点の最たる例はコマンドレット(Cmdlet)と関数(Function)だと思う。
今回は久しぶりにがっつりとShellを書く機会があったので、ついでに調べてみた。

PS理解に欠かせないコマンドレット(Cmdlet)


コマンドレット(Cmdlet)は、PowerShellで利用可能なコマンドのことで、「Move-Item」などのフルスペル、「md」などのAliasも全て含まれている。
PowerShellの基本(前編) (3/5)
使用可能なコマンドレットは「Get-Command」を実行することで確認できる。

PS C:\Users\User> Get-Command

CommandType     Name                                               Version    Source       
-----------     ----                                               -------    ------       
Alias           Add-ProvisionedAppxPackage                         3.0        Dism         
Alias           Add-ProvisioningPackage                            3.0        Provisioning 
Alias           Add-TrustedProvisioningCertificate                 3.0        Provisioning 
Alias           Apply-WindowsUnattend                              3.0        Dism         
Alias           Disable-PhysicalDiskIndication                     2.0.0.0    Storage      
Alias           Disable-StorageDiagnosticLog                       2.0.0.0    Storage                                                       
Function        Add-BCDataCacheExtension                           1.0.0.0    BranchCache  
Function        Add-BitLockerKeyProtector                          1.0.0.0    BitLocker    
Function        Add-DnsClientNrptRule                              1.0.0.0    DnsClient    
Function        Add-DtcClusterTMMapping                            1.0.0.0    MsDtc       
Cmdlet          Get-DOPercentageMaxBackgroundBandwidth             1.0.0.0    DeliveryOp...
Cmdlet          Get-DOPercentageMaxForegroundBandwidth             1.0.0.0    DeliveryOp...
Cmdlet          Get-Event                                          3.1.0.0    Microsoft....
Cmdlet          Get-EventLog                                       3.1.0.0    Microsoft.... 

ここで主題となる疑問が浮かぶ。"Cmdlet"と"Function"の違いって何?

Cmdlet と Function


結論から言うと、コマンドそのものの成り立ちが違うらしい。
【Cmdlet】

  • コンパイルされたコードで、.NET言語で記述され、.dllから提供される.
  • コンパイル言語により提供されるため低レベルな処理を提供でき、自由度が高い.
  • コンパイルされているため高速に動作する.
  • 作成するときにコンパイルしなければいけない.

【Function】

  • PowerShellで記載されたスクリプトコード.
  • PowerShellで記述するため.NET言語に比較すると自由度が低い.
  • コンパイルする必要性がないため作成が容易.

結局のところ...


開発者側として、"Cmdlet"と"Function"の違いを理解しておくことは有益だと感じた。
ただ、エンドユーザーとして使う上で、これらの違いを知っておく必要性は薄い印象。普段の会話の中で、「コマンドレット」という場合には、明確にこれらの違いを意識する必要もさせる必要もなく、単に"PowerShellで利用可能なコマンドのこと"という理解の方が無用な混乱を招かない。

参考・引用