tech.guitarrapc.cóm

C#, PowerShell, Unity, Cloud, Serverless Technical Update and Features

PowerShell 3.0で入力パラメータを短くできるのか

できます。 PowerShell 1.0の頃からだったような? 基本的にはそのパラメータと一意に絞れる程度まで入力すれば、以降の文字は入力せずとも受け付けます。 ではそのサンプルを。

短くしてみよう

良く使われるところで、Get-Commandを使ってみます。 Aliasに関するコマンドだけを抜き出すには以下のコマンドレットを記述します。
Get-Command -CommandType Alias
ではこのコマンドを短くしてみます。 まずは、コマンド名ですね。 Get-CommandのAliasはgcmです、
gcm -CommandType Alias
更に、パラメータの-CommandTypeも短くします。
gcm -C Alias
続けて、引数のAliasも短くします。
gcm -C Ali
このようにパラメータが一意に定まる文字さえ入力すれば、コマンド入力を短くできます。

短くできないパターン

では、引数をAにはできないのでしょうか。
gcm -C A
Aだけでは、引数がAllAliasかを一意に特定できないためエラーが返ってきます。
Get-Command : パラメーター 'CommandType' をバインドできません。値 "A" を型 "System.Management.Automation.CommandTypes" に変換できません。エラー: "次の列挙子名を区別できないため、識別子名 A を処理できません: Alias, Application, All。より詳細な識別子名で試してください。"
発生場所 行:6 文字:8
+ gcm -C A
+        ~
    + CategoryInfo          : InvalidArgument: (:) [Get-Command]、ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.GetCommandCommand
この場合、allaliとすれば、引数が一意に定まるため実行されます。 ※当然alでも上記と同様のエラーが返ってきます。
gcm -C all
gcm -C ali

Select-Objectでのスクリプトブロックへの活用

Aliasや短縮を活用するのは、主にコマンドモード(Console)でかと思います。 式モード(ISEなど)では、コマンドを知らない人のため……という理由でフルネームが使われやすいようで……ぐぬぬ。 ただし、式モードでもささやかながら使えそうな場面があります。 それが、Select-ObjectなどでのScript Block使用時です。 例えば、Processを取得するGet-Processコマンドを考えます。 ※全然意味のないサンプルですが…すいません。
Get-Process `
    | select @{label="Id";expression={"TEST ID: " + $_.Id}},
        @{l="Name";e={"TEST NAME: " + $_.Name}}
結果です。
Id   : TEST ID: 8640
Name : TEST NAME: Zune
Script Block 1行目のlabelexpressionを、2行目ではleに置き換えています。 結構便利ですしScript Block触る人なら流石に……っていうのは甘いのでしょうか?

まとめ

PowerShell 3.0 (1.0からのはず?)では、コマンドのAlias以外にも、入力パラメータや引数を一意に絞れれば省略が可能です。 コード規則とか可読性と上手くお付き合いして、活用すると記述が楽になります。 「動詞-名詞」の規則は……とかいう突込みは……。 まぁ、そもそもIntellisenceさんやタブ補完でフルネーム入力に慣れている私がいうのもなんですが。

参考

#PSTip Argument disambiguation in PowerShell 3.0