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で利用可能なコマンドのこと"という理解の方が無用な混乱を招かない。