PowerShell Advent Calendar 2015 6日目の記事です。
小ネタです。
たいしたことではないですが地味に便利です。
コマンドレットを使う時に知っておくとちょっとだけ便利なこと
Microsoftから標準で提供されるコマンドレットは原則-Name
や-Path
パラメータでワイルドカードをサポートしています。*1
Get-ChildItem(ls)
コマンドレットなんかは容易にワイルドカードをサポートしているだろうと想像がつきますが、他の、一見ワイルドカードをサポートしてなそうに見えるコマンドレットでも-Name
や-Path
パラメータはワイルドカードをサポートしています。*2
-Name
や-Path
以外のパラメーターについてはコマンドレットの実装次第なのでヘルプで確認する必要があります。
とりあえず、
基本的に
-Name
と-Path
パラメータはワイルドカードをサポートしている
と覚えておくとコマンドレットを使う時に結構便利になります。
例えばGet-WindowsFeature
なんかも当たり前の様に-Name
パラメーターでワイルドカードをサポートしていて以下の様なコマンドを打つことができます。
# Windows Server 2012 R2で実施 # 名前に NET を含む機能を検索 (主に.NET Framework絡みの機能がヒットする) PS C:\> Get-WindowsFeature -Name "*NET*"
実行結果 (結果が絞られていることがわかる)
コマンドレットのワイルドカード
コマンドレットでサポートされているワイルドカードは以下の4パターンになります。
ワイルドカード | 用例 | 検索条件 |
---|---|---|
* | Power* | 0文字以上の任意の文字にマッチ |
? | Power?hell | 指定位置で任意の文字にマッチ |
[] | [bc]ook | 特定の文字にマッチ |
[ - ] | [a-e]ook | 特定の文字のレンジにマッチ |
詳細は Supporting Wildcard Characters in Cmdlet Parameters を参照してください。
開発ガイドラインでのワイルドカードのサポートについて
コマンドレットの開発ガイドラインによると、タイトルが、
Strongly Encouraged Development Guidelines
で、内容に、
Support Windows PowerShell Paths
(中略)
If your cmdlet allows the user to specify a file or a data source, it should define a parameter of type String. If more than one drive is supported, the type should be an array. The name of the parameter should be Path, with an alias of PSPath. Additionally, the Path parameter should support wildcard characters. If support for wildcard characters is not required, define a LiteralPath parameter.
Support Wildcard Characters
A cmdlet should support wildcard characters if possible. Support for wildcard characters occurs in many places in a cmdlet (especially when a parameter takes a string to identify one object from a set of objects). For example, the sample Stop-Proc cmdlet from the StopProc Tutorial defines a Name parameter to handle strings that represent process names. This parameter supports wildcard characters so that the user can easily specify the processes to stop.
と記載されている様にワイルドカードのサポートは強く推奨されています。
このためMicrosoft標準でないコマンドレットにおいてもある程度はワイルドカードがサポートされていると思います。
また、自分でコマンドレットを作る際にワイルドカードをサポートするとより統一感のある良いコマンドレットになります。
実装は個別に行わないといけないのですが、[System.Management.Automation.WildcardPattern]
クラスでユーティリティメソッドなどが提供されている様です。
以下のサイトに細かい話が載っていますので参考にしてみてください。