2010年6月20日日曜日

◆パイプ処理の排他を回避する

以下のようなコマンドで、テキストファイルの文字列置換を行おうとすると、

Get-Content test2.csv | %{$_ -replace "2010/06","2010/07"} | Set-Content test2.csv

こんなエラーメッセージが出る。

Set-Content : 別のプロセスで使用されているため、プロセスはファイル 'D:\test2.csv' にアクセスできません。
発生場所 行:1 文字:61
+ gc test2.csv | %{$_ -replace "2010/06/16","2011/06/16"} | sc <<<<  test2.csv
    + CategoryInfo          : NotSpecified: (:) [Set-Content]、IOException
    + FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Commands.SetContentCommand

テキストを1行ずつ読み取り、順次パイプラインに流し込むためだろう。
Get-ContentはReadCountパラメータがあって、ゼロを指定するとすべてを一度に読み込むとある。
これを使えばOKかと思ったがなぜかうまくいかない。
以下のように括弧で括ってあげる必要がありそうだ。

(Get-Content test2.csv) | %{$_ -replace "2010/06","2010/07"} | Set-Content test2.csv

ファイルサイズが大きい場合は一旦一時ファイルに出力なんてことをしたほうが良いかも。

0 件のコメント:

コメントを投稿