2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PowerShellで文字コード変換

Last updated at Posted at 2020-03-03

#文字コード変換したいけど・・・
まだまだIBMホストが動いているのか文字コードをEBCDICにして納品する先がありました。
SJIS⇒UTF-8はサクラエディタなどで簡単に変換できますがEBCDICとなると話は別。
WindowsPCの標準機能で解決するとしたらPowerShellかなぁと思いいろいろ調べました。
こちらをほぼほぼそのまま流用させていただきました
そして出来上がったのがこちら。

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

# 引数$from、$toから、文字コードを表すEncodingオブジェクトを生成
$enc_f = [Text.Encoding]::GetEncoding($from)
$enc_t = [Text.Encoding]::GetEncoding($to)
# 与えられたパスから合致するファイルリストを再帰的に取得
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)
  # 変換元ファイルを順に読み込み、保存先ファイルに書き込み
      $tmp = $reader.Readtoend()
      $reader.Close()
      $tmp = $tmp -replace "`r`n",''
      $writer.Write($tmp)
  # ファイルをすべてクローズ
      $writer.Close()
    }
  }

同じ階層にBEFOREフォルダを作成して、その中に変換したいファイルを放り込んで実行するとAFTERフォルダの中に文字コード変換後のファイルが同名で作成されます。
今回は改行コードなしだったので最後にCRLFを削除してますのでご注意を。
#SJISからUTF-8(BOMなし)も・・・
今度はUTF-8への変換ということでファイルの容量も大きいことからPG流用したところBOM付きのためリテイク。
いろいろと調べてBOMなしの時はこちら。

Convert2.ps1
# スクリプトファイルのパラメータを宣言(先頭から「変換対象のフォルダ」
# 「変換後のファイルの保存先」「変換前の文字コード」「変換後の文字コード」)
param(
  [String]$in = "BEFORE",
  [String]$out = "AFTER",
  [String]$from = "Shift-JIS",
  [String]$to = "UTF-8"
)

# 引数$from、$toから、文字コードを表すEncodingオブジェクトを生成
$enc_f = [Text.Encoding]::GetEncoding($from)
# BOMなしの場合はオブジェクト作成!!
$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
  # 与えられたパス(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, $Utf8NoBomEncoding)
  # 変換元ファイルを順に読み込み、保存先ファイルに書き込み
      $tmp = $reader.Readtoend()
      $reader.Close()
      $tmp = $tmp -replace "`r`n","`n"
      $writer.Write($tmp)
  # ファイルをすべてクローズ
      $writer.Close()
    }
  }
2
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?