連載
» 2008年04月18日 05時00分 UPDATE

Tech TIPS:WindowsのPowerShellで複数のファイルの文字コードを一括変換する

指定されたフォルダの下に存在する複数のテキストファイルの文字コードを一括で変換したいことがある。PowerShellでは、標準的な.NET Frameworkのライブラリを利用することで、特別なコンポーネントを導入することなく、これを実現できる。

[山田祥寛,デジタルアドバンテージ]
Tech TIPS
Windows Server Insider


「Tech TIPS」のインデックス

連載目次

対象ソフトウェア:Windows PowerShell



解説

 昨今では、複数の文字コードに対応したテキストエディタも多くなってきたことから、テキストファイルの文字コードを変換することは、それ自体、それほど難しいことではない。しかし対象となるファイルが何十にも及んだ場合、これを1つ1つ手作業で変換しなければならないのは、やはり手間だし、人為的な間違いや漏れが発生する可能性がある。

 本TIPSでは、特定のフォルダ配下に収められた複数のテキストファイルの文字コードをPowerShellを使って一括で変換する方法について紹介する。フォルダ配下のサブフォルダまで再帰的に処理されるため、対象ファイルの指定もシンプルだ。

操作方法

●手順1――テキストエディタでPowerShellのコードを入力する

 まずはテキストエディタ(メモ帳でも何でもよい)を開き、以下のコードを入力してほしい。なお「#」で始まる行は、コードの意味を解説するためのコメント部分なので、省略してもよい。コメントにはスクリプトの簡単な説明を入れておいた。

※ファイル:FileConvert.ps1

    # スクリプトファイルのパラメータを宣言(先頭から「変換対象のフォルダ」
    # 「変換後のファイルの保存先」「変換前の文字コード」「変換後の文字コード」)
param(
  [String]$in = "c:\tmp\convert",
  [String]$out = "c:\tmp\converted",
  [String]$from = "Shift-JIS",
  [String]$to = "EUC-JP"
)

    # 引数$from、$toから、文字コードを表すEncodingオブジェクトを生成
$enc_f = [Text.Encoding]::GetEncoding($from)
$enc_t = [Text.Encoding]::GetEncoding($to)
    # 与えられたパス(c:\tmp\convert)から合致するファイルリストを再帰的に取得
  Get-ChildItem $in -recurse |
    # 取得したファイルを順番に処理
    ForEach-Object {
    # 取得したオブジェクトがファイルの場合のみ処理(フォルダの場合はスキップ)
      if($_.GetType().Name -eq "FileInfo"){
    # 変換元ファイルをStreamReaderオブジェクトで読み込み
        $reader = New-Object IO.StreamReader($_.FullName, $enc_f)
    # 保存先のパス、保存先の親フォルダのパスを生成
        $o_path = $_.FullName.ToLower().Replace($in.ToLower(), $out)
        $o_folder = Split-Path $o_path -parent
    # 保存先のフォルダが存在しない場合にフォルダを自動生成
        if(!(Test-Path $o_folder)){
          [Void][IO.Directory]::CreateDirectory($o_folder)
        }
    # 保存先ファイルをStreamWriterオブジェクトでオープン
        $writer = New-Object IO.StreamWriter($o_path, $false, $enc_t)
    # 変換元ファイルを順に読み込み、保存先ファイルに書き込み
        while(!$reader.EndOfStream){$writer.WriteLine($reader.ReadLine())}
    # ファイルをすべてクローズ
        $reader.Close()
        $writer.Close()
      }
    }

サンプルファイルFileConvert.ps1をダウンロードするには、ここをクリックしてください。

 PowerShellスクリプトの実行ファイルは拡張子を「.ps1」とする必要がある。ファイル名自体は何でも構わないが、ここでは「FileConvert.ps1」という名前で保存しておこう。

 コード全体の流れについてはリスト内のコメントをご覧いただくとして、ここで注目してほしいのは、次の点だ。

  • ファイルの読み書きを行うのはStreamReader/StreamWriterクラスの役割

 StreamReader/StreamWriterクラスは.NET Frameworkで提供されるクラスで、それぞれファイルの読み書きに関する機能を提供するものだ。ここでは、これらのクラスが読み込み/書き込み時に文字エンコーディングを指定できることを利用して、StreamReaderクラスから指定した文字コードでファイルを読み込み、StreamWriterクラスでさらに新たに文字コードを指定して新規のファイルへの書き込みを行っている。これによって、ファイルの文字コードを変換することができる。

 StreamReader/StreamWriterクラスについては、別記事の「テキストファイルの内容を読み込むには?」「ファイルにテキストを書き込むには?」(Insider.NETフォーラム)が詳しいので、参照していただきたい。

●手順2――PowerShellのスクリプトコードを実行する

[注意]

PowerShellでスクリプトファイルを実行する場合には、あらかじめいくつかの設定を行っておく必要がある。詳細については、別稿「Windows PowerShellコマンド&スクリプティング入門(後編)」を参照いただきたい。


 FileConvert.ps1を実行するには、PowerShellのプロンプトを開いたうえで、以下のようにコマンドを実行すればよい。また利用に当たっては、「c:\tmp\Convert」フォルダ配下に変換対象のテキストファイルが、変換後のファイルの保存先として「c:\tmp\Converted」フォルダが存在することを確認しておいてほしい。

PS > ./FileConvert.ps1


 エラーが表示されずにスクリプトが終了し、かつ、所定のフォルダ(ここでは「c:\tmp\Converted」)に変換後のファイルが保存されていれば成功だ。

 この例では引数なしで実行しているが(すべてデフォルトのままで実行しているが)、変換するファイルの場所や文字コードを変更したければ、次のように、

PS > ./FileConvert.ps1 c:\tmp\test\Convert c:\tmp\test\Converted Shift_JIS UTF-8


「変換対象のフォルダ」「変換後のファイルの保存先」「変換前の文字コード」「変換後の文字コード」の順に引数を指定する。この例では、「c:\tmp\test\Convert」にあるテキストファイルがShift_JISからUTF-8コードに変換され、その結果が「c:\tmp\test\Converted」に保存される。指定可能な文字コード名としては次のようなものがある。

コード名 文字コード
shift_jis 日本語(シフトJIS)
iso-2022-jp 日本語(JIS)
euc-jp 日本語(EUC)
utf-16 Unicodeリトルエンディアン
unicodeFFFE Unicode(ビッグエンディアン
utf-32 Unicode(UTF-32リトルエンディアン)
utf-32BE Unicode(UTF-32ビッグエンディアン)
utf-7 Unicode(UTF-7)
utf-8 Unicode(UTF-8
us-ascii US-ASCII
指定可能な文字コード名の例
ここでは日本語環境でよく使われると考えられる文字コード名を挙げておいた(大文字/小文字の違いは無視される)。これ以外にも利用可能な文字コード名は数多くあるが、詳細はマイクロソフトMSDN「Encodingクラス」の表を参考にしていただきたい。

「Tech TIPS」のインデックス

Tech TIPS

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。