標準の Get-ChildItem
コマンドレットの名前を維持し、新たに FilterExtension
引数を追加して特定の拡張子に対するフィルタリングを行う機能を追加します。このカスタマイズ版では、基本的な機能をそのまま保持しつつ、新たな機能を組み込みます。
https://github.com/PowerShell/PowerShell/blob/master/src/Microsoft.PowerShell.Commands.Management/commands/management/GetChildrenCommand.cs
# プロジェクトフォルダの構成
📂CustomizedGetChildItemApp
┣ 📂Classes
┃ ┣ 📜CustomizedGetChildItemCmdlet.psm1 # Get-ChildItemのカスタマイズ版モジュール
┣ 📂Tests
┃ ┣ 📜CustomizedGetChildItemTests.ps1 # カスタマイズ版のテストスクリプト
┗ 📜App.ps1 # アプリケーションのメインスクリプト
# CustomizedGetChildItemCmdlet.psm1
using namespace System.Management.Automation
using namespace System.IO
# Cmdletのカスタマイズ定義
[Cmdlet(VerbsCommon.Get, "ChildItem", DefaultParameterSetName = "Items")]
Class CustomizedGetChildItem : Microsoft.PowerShell.Commands.GetChildItemCommand
{
[Parameter(Mandatory = $false, ParameterSetName = "Items")]
[ValidateNotNullOrEmpty()]
[string] $FilterExtension
# Cmdletの処理をオーバーライド
protected override void ProcessRecord()
{
# 基本機能の呼び出し
base.ProcessRecord();
# オリジナル引数に基づく追加処理
if ($this.FilterExtension) {
$filteredItems = @($this.InputObject) | Where-Object { $_.Extension -eq ".$this.FilterExtension" }
foreach ($item in $filteredItems) {
Write-Output $item
}
}
}
}
Export-ModuleMember -Cmdlet CustomizedGetChildItem
このクラスはPowerShellの標準コマンド Get-ChildItem
をカスタマイズしたものです。以下、各部分の説明を行います:
System.Management.Automation
と System.IO
は、PowerShellスクリプト内でファイル操作やCmdletの開発に必要な機能を提供するために使用される名前空間です。[Cmdlet(VerbsCommon.Get, "ChildItem", DefaultParameterSetName = "Items")]
この行は、このクラスが Get-ChildItem
コマンドレットのカスタマイズ版であることを定義しています。ここで VerbsCommon.Get
は操作の種類(取得)、"ChildItem"
はコマンド名を指します。Class CustomizedGetChildItem : Microsoft.PowerShell.Commands.GetChildItemCommand
は、CustomizedGetChildItem
クラスが GetChildItemCommand
クラスを継承していることを示しています。これにより、標準の Get-ChildItem
コマンドの機能を拡張または変更できます。[Parameter(Mandatory = $false, ParameterSetName = "Items")]
この行で、FilterExtension
という名前のパラメータを定義しています。このパラメータは必須ではない(Mandatory = $false
)こと、そしてデフォルトのパラメータセット「Items」に属していることが指定されています。[ValidateNotNullOrEmpty()]
は、このパラメータがnullまたは空でないことを保証するためのバリデーション属性です。[string] $FilterExtension
は、FilterExtension
パラメータが文字列型であることを示しています。このパラメータを使用して、特定のファイル拡張子にフィルタリングを行います。protected override void ProcessRecord()
このメソッドは、コマンドレットが呼び出されたときに実行される処理を定義しています。override
キーワードは、基底クラスのメソッド(ProcessRecord
)の動作を変更するために使用されます。base.ProcessRecord();
は、基底クラスの ProcessRecord
メソッドを呼び出して、標準の Get-ChildItem
コマンドの処理を実行します。