適材適所

PowerShellやVBAなどプログラミング系の話多めで

【PowerShell】テキストファイルの中身をクリアする【Clear-Content】

テキストファイルの中身をクリアしたいときにしたいときの備忘録。

テストなどで大量のテキストファイルの中身を消去して空の状態にしなくてはならなかったので、そのときに考えた手法を書き残しておきます。

Clear-Contentコマンドレットしか勝たん!!

【結論】Clear-Contentコマンドレットを使う

基本はこれ一択です。

 
Clear-Content-Path '対象のフォルダ'

フォルダ内のテキストファイルを一気にクリアするときはGet-ChildItemと組み合わせると楽に処理することができます。

 
Get-ChildItem -Path '対象のフォルダ' -Filter "*.txt"| Clear-Content

先に言っておきますが、これ以降は蛇足です!!

空文字で置き換える

Out-Fileコマンドレットを使って$null変数をファイルに上書きする手法です。

$null変数をテキストファイルに書き込んであげると中身は空になります。

 
$null|Out-File -Force -LiteralPath '対象のフォルダのパス' -Encoding ascii

ここで1点注意が必要なのは、-Encodingを指定する必要がある点です。

PowerShellの既定ではUnicodeのリトルエンディアンが使用されるので、-Encodingを指定しないと バイトオーダーマークが入り込んでしまいます。 メモ帳で開いたときに一見空に見えますが、サイズが1KBになっています。

一見、何もないように見えるが・・・ f:id:shinmai_papa:20210906150720p:plain

サイズがおかしい。 f:id:shinmai_papa:20210906150724p:plain

バイナリエディタで中身を確認すると、しっかり0xFF 0xFEがはいっている。 f:id:shinmai_papa:20210906150729p:plain

同一フォルダ内の複数のテキストファイルを空にしたい場合は先ほどと同じようにGet-ChildItem等と組み合わせてforeachで処理すると楽ですね。

 
Get-ChildItem '対象のフォルダ'|foreach{Out-File -Force -LiteralPath $_.FullName -InputObject $null -Encoding ascii}

一度テキストファイルを削除して新しいテキストファイルを作成する

フォルダ内のテキストファイルをいったん全て削除して同じ名前でつくれば見た目は空になったのと同じ!!というかなりの脳筋プレーです。

 
$targets=Get-ChildItem -Path "対象のフォルダ" -Filter "*.txt"
$targets|Remove-Item
$targets|foreach{New-Item -Path $_.fullname}

ただし厳密には作成日時等が変わってくるため同じではありません。

終わりに

テキストファイルをクリアする手法について紹介してみました。

なぜClear-Contentで事足りるのに別の方法を考えたかと言うと、最初Clear-Contentという便利コマンドレットがあることに気が付いていなかったんです。

途中まで考えて途中、このコマンドレットの存在に気が付きました。

まだまだ勉強不足・・・。

というわけで、ここまでお読みいただき、ありがとうございました。