昔、どこかで見たTips。

$PSDefaultParameterValues["Out-Default:OutVariable"] = "LAST"

上記コードを $PROFILE に仕込んでおくと、コマンド実行結果が $LAST 変数に入る。

PS1> Get-ChildItem

    Directory: ....

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2022/05/24    17:12                *********
...

PS1> $LAST

    Directory: ....

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2022/05/24    17:12                *********
...

PS1>

直前のコマンド実行結果を再度確認したい時や、加工したい場合に便利。

仕組み

Out-Default コマンドレット

PowerShell はコマンドラインをAST解析して、各コマンドをまとめたパイプラインにまとめる。 このパイプラインの最後のコマンドがFormat系(Format-ListFormat-Table)でない場合に、暗黙的にOut-Defaultを末尾に追加する動きをしている。

  • Get-ChildItemGet-ChildItem | Out-Default
  • Get-ChildItem | Select-Object ...Get-ChildItem | Select-Object ... | Out-Default
  • Get-ChildItem | Format-List ...Get-ChildItem | Format-List ... (末尾がFormat-* なのでOut-Default は追加されない)

-OutVariable パラメーター

また、すべてのコマンドレットには、出力結果を引数に指定した変数名の変数に収める -OutVariable というパラメーターを指定できる。 パイプラインに出力するオブジェクトを出力と同時に変数に収める。

変数は ArrayList 型で、出力が単一であっても配列になる点に注意。

$PSDefaultParameterValues 変数

$PSDefaultParameterValues のディクショナリのキーに <コマンド名>:<パラメーター名>、値にそのパラメーターの値を入れるとパラメーターの規定値を設定できる。


これらを組み合わせる。

$PSDefaultParameterValues["Out-Default:OutVariable"] = "LAST"

すると、Get-ChildItem ...Get-ChildItem | Out-Default -OutVariable LAST に変換される。

使い道

フィルタリングする

PS1> Get-ChildItem
...
PS1> $LAST | Where-Object Length -gt 1MB

直前の結果をログに残す

PS1> Get-ChildItem
...
PS1> $LAST | ConvertTo-Json | Set-Content file-list.json