昔、どこかで見た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-ListやFormat-Table)でない場合に、暗黙的にOut-Defaultを末尾に追加する動きをしている。
Get-ChildItem→Get-ChildItem | Out-DefaultGet-ChildItem | Select-Object ...→Get-ChildItem | Select-Object ... | Out-DefaultGet-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