PowerShellコマンドのパラメータの渡し方
PowerShellインアクション購入。ようやく読み始めた。
コマンドのパラメータの渡し方が複数あることは知ってたけど、細かいところで知らなかった部分があったんでメモ。(パイプラインで入力されたオブジェクトのプロパティがバインドされるとか。)
まず、名前付きパラメータ渡し。一番優先度高い。
C:\Users\Public> ls -Path Music
で、これ知らなかったんですけど、名前付きパラメータは、名前:値 って形で渡すことも可能。
C:\Users\Public> ls -Path:Music
次に優先されるのが位置パラメータ。
C:\Users\Public> ls Music
ls の場合、Path が第1パラメータなんで、この場合 ls -Path Music と同じ。
ls D* -Path . とかすると、第2パラメータの -Filter に D* が設定される。
で、次に、パイプライン入力。
C:\Users\Public> 'Music', 'Pictures' | ls
ls の場合、-Path がパイプライン入力を受け付けてるんで、これは、ls -Path Music; ls -Path Pictures と同じ動作。
位置パラメータの方が優先度高いんで、以下のコマンドはエラーになる。(-Path は位置パラメータの 'Music' ですでに指定されてるんで、パイプライン入力を受け付けられない。)
C:\Users\Public> 'Picture' | ls Music
ただし、パイプラインから入力されたオブジェクトがパラメータの型と一致するか型変換可能でないとダメ。(-Path の場合は string)
最後に、これもはじめて知ったんですけど、パイプライン入力がパラメータの型と合わない場合、プロパティでパラメータ名と一致するものを探してその値を設定してくれる。
C:\Users\Public> ($x = New-Object PSObject) | Add-Member NoteProperty Path Music C:\Users\Public> $x.Path Music C:\Users\Public> $x | ls
これで、ls -Path Music と同じ処理。
でも、これはあくまで、パイプライン入力を受け付けてるパラメータにしか有効じゃないらしい。例えば、
$x = New-Object PSObject $x | Add-Member NoteProperty Path . $x | Add-Member NoteProperty Filter D* $x | ls
とやっても、ls -Path . -Filter D* にはならない(ls -Path . になる)。それほど使い勝手よくないかも。