この記事をシェアする

PowerShellスクリプトでShift-JISのファイルをUTF-8に変換する(PowerShell 5.1.22621.1778)

前提

この記事を書く際に使用したPowerShellのバージョン:5.1.22621.1778

結論

$file = [System.IO.File]::ReadAllText('元ファイルのフルパス',[Text.Encoding]::GetEncoding(932))
[System.IO.File]::WriteAllText('出力するファイルのフルパス',$file)

実際の動き

こんな感じでスクリプトを組む

スクリプト実行前のディレクトリ内がこれ

before.txtの内容がこんな感じ
ちっちゃくて恐縮だが、右下の文字コードがShift JISになっていることがわかると思う

この状態でtest.ps1を実行すると…

以下の通り、after.txtが生成される

文字コードもちゃんとUTF-8になっている

こういう時に使う(使った)

↓みたいな感じでExcelファイルをCSVに変換するPowerShellスクリプトを組んだんだけど、これだとShift-JISでファイル出力されてしまうためPHPで取り扱うには都合が悪く、どうにか同じスクリプト内でUTF-8への変換もやってしまいたいと思った次第。

$excel = New-Object -ComObject Excel.Application
$excel.DisplayAlerts = $false
$excel.Workbooks.open('Excelファイルのフルパス')
$w = $excel.Worksheets.Item('CSVに変換したいシート名')
$w.SaveAs('出力するCSVファイルのフルパス',6)

$excel.Workbooks.Close()
$excel.Quit()
# ちなみにExcelのインスタンスをちゃんと閉じとかないと生成したCSVファイルがロックされて編集・削除ができなくなるゾイ(一敗)

いやこれでSaveAsに文字コード指定オプションとかあったら笑うが──

引用元:https://learn.microsoft.com/ja-jp/office/vba/api/excel.xlfileformat

…………

!?!??!?!?!

いや…まだわからん。もしかしたらBOM付きUTF-8で保存されるとかかもしれんし…

こんな感じ↓でスクリプト組んで…

$b = (Get-Location).Path + "\before.xlsx"
$a = (Get-Location).Path + "\after.csv"

$excel = New-Object -ComObject Excel.Application
$excel.DisplayAlerts = $false
$excel.Workbooks.open($b)
$w = $excel.Worksheets.Item("Sheet1")
$w.SaveAs($a,62)

$excel.Workbooks.Close()
$excel.Quit()

こんな感じのエクセルファイル作って…

スクリプト実行前のフォルダ内の様子

test2.ps1を実行!!!

after.csvが出力されている

after.csvの中身を覗いてみると…

B、BOM付きか~~~~~~~
これはこれでなんか釈然としないな…

この記事をシェアする