ファイルをその場で操作する、すばやく簡単なコマンドを入力できるようにしたいと考えています。例えば:
# prettify an XML file
format-xml foo | out-file foo
パイプラインは「貪欲」になるように設計されているため、これは機能しません。アップストリーム コマンドレットが入力の最初の行を処理するとすぐに、ダウンストリーム コマンドレットはファイルへの書き込みロックを取得します。これにより、アップストリーム コマンドレットはファイルの残りの部分を読み取れなくなります。
考えられる回避策は多数あります。一時ファイルへの書き込み、操作を複数のパイプラインに分ける (中間結果を変数に格納する) などです。しかし、これは非常に一般的なタスクであり、シェルに適した迅速なショートカットが開発されていると思います。
私はこれを試しました:
function Buffer-Object
{
[CmdletBinding()]
param (
[parameter(Mandatory=$True, ValueFromPipeline=$True)]
[psobject] $InputObject
)
begin { $buf = new-list psobject }
process { $buf.Add($InputObject) }
end { $buf }
}
format-xml foo | buffer-object | out-file foo
状況によっては正常に動作します。短いエイリアスにマップされ、PSCX のような一般的なディストリビューションに組み込まれているため、迅速な対話型タスクには「十分」です。残念ながら、一部のコマンドレット (out-file を含む) は、Process{} ではなく Begin{} メソッドでロックを取得しているように見えるため、この特定の例は解決されません。
他のアイデア?