しばたテックブログ

気分で書いている技術ブログです。

コマンドレットを使う時に知っておくとちょっとだけ便利なこと

PowerShell Advent Calendar 2015 6日目の記事です。

atnd.org

小ネタです。
たいしたことではないですが地味に便利です。

コマンドレットを使う時に知っておくとちょっとだけ便利なこと

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*"

実行結果 (結果が絞られていることがわかる)
f:id:stknohg:20151204094351p:plain

コマンドレットのワイルドカード

コマンドレットでサポートされているワイルドカードは以下の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]クラスでユーティリティメソッドなどが提供されている様です。

以下のサイトに細かい話が載っていますので参考にしてみてください。

www.powershellmagazine.com

*1:Microsoft標準でないコマンドレットはこの限りではありません。

*2:少し細かい補足をするとこの原則があるため一部のコマンドレットではワイルドカードをサポートしない-LiteralNameや-LiteralPathパラメーターがあったりします。