チラシのはじっこ

ゆったりと生きています。雑多なメモ置き場予定地。

テキストファイルをPowershellで結合しようとしてハマった話

はじめに

大量のテキストファイル(正確には.sqlファイル)の内容を1つにまとめたい場面に遭遇した。流石に100以上のファイルを1つ1つ開いてコピペしていくのは無理があるし時間がもったいない。
なのでPowershellコマンドプロンプトを利用する方法を調べて試行してみた。最終的には上手く行ったものの、出力ファイルの文字化けでだいぶ苦しんだので備忘のため記録。

試したこと

Powershellで Get-Content & Set-Content を使う

下のサイトのような記事を複数見つけ、Get-Contentを使う方法を初めに試した。


早速Powershellにコマンドを打ち込んでみる。

Get-Content *.sql | Set-Content log.txt 
  • 結果:UTF-8で開くと割と良い感じだが、ちょいちょい「‥E」のような文字や見たことのない漢字が出現。リンク先には文字化けしないと書いてあるが、そうとも限らないようだ。

Powershellで "type *.sql > out.txt" を実行

  • 結果:日本語文字化け
  • 補足:Powershellでtypeを使う際、入力ファイル名に*を使う場合、出力ファイルの拡張子は別のものにしておかないと無限ループに陥る。

おそらくは文字コードの問題だろうと考え、UTF-8で出力する方法を調べる。

文字コードを指定してみる

UTF-8で出力するためにコードページ 65001を指定

chcp 65001
  • 結果:こうかが ないみたいだ…

他にも、BOM付きなのが悪さをしている気がしていくつか記事を見つけたが、処理内容が理解できない素人が動かすのも怖いので試さずにそっ閉じ。

  • 参考



コマンドプロンプトでtypeを使う

あれこれ調べているうちにコマンドプロンプトの存在を思い出す。
type くらいの基本的な(?)コマンドだったらcmdでもできるのでは?
それにPowershellと挙動が若干違うだろうから、もしかすると問題なく動くのでは?
と天啓が降りてきた考えて実行。

type *.sql > log.txt

  • 結果:上手く行きました!!!

結論

Powershellでこねくり回すよりもコマンドプロンプトが便利なこともある。
少なくとも「type」はその具体例だった。