テキスト形式のファイルのエンコードを変換するスクリプトです。
スクリプトは2つあって、単一のファイルだけを変換するものと、複数のファイルをまとめて変換するスクリプトがあります。
単一の方はConvertEncode.ps1で、複数の方はConvertEncodeMultiFiles.ps1です。
基本的にやることはどっちも一緒で、最初にエンコードを取得して、その後ファイルの読み込みと書き込み時に指定されたエンコードですれば終わりです。
単一ファイルの例
ConvertEncode.ps1
#$sourceFile: 変換したいファイル名
#$destFile: 変換後のファイル名
#$sourceEncodeName: 変換前のファイルのエンコード名
#$destEncodeName: 変換後のファイルのエンコード名
Param([string] $sourceFile, [string] $destFile, [string] $sourceEncodeName, [string] $destEncodeName)
#エンコードの取得
[System.Text.Encoding] $encS = [System.Text.Encoding]::GetEncoding($sourceEncodeName)
[System.Text.Encoding] $encD = [System.Text.Encoding]::GetEncoding($destEncodeName)
#どういう変換をしたかを示すログ
"変換:" + $encS.EncodingName + " >>> " + $encD.EncodingName
#カレントディレクトリの取得
$currentPath = Get-Location
#ファイルのパスの整形
if($sourceFile.StartsWith(".") -eq $true)
{
$sourceFile = $sourceFile.Substring(1)
$sourceFile = $currentPath.Path + $sourceFile
}
if($destFile.StartsWith(".") -eq $true)
{
$destFile = $destFile.Substring(1)
$destFile = $currentPath.Path + $destFile
}
#ファイル名のログ
"ファイル:" + $sourceFile + " >>> " + $destFile
#変換処理
[System.IO.StreamReader] $reader = New-Object System.IO.StreamReader($sourceFile, $encS)
[string] $data = $reader.ReadToEnd()
$reader.Close()
[System.IO.StreamWriter] $writer = New-Object System.IO.StreamWriter($destFile, $false, $encD)
$writer.Write($data)
$writer.Close()
"変換終了"
実行例は次のような感じです。
.\ConvertEncode.ps1 .\sample.html .\UTF8\sample.html "Shift-JIS" "UTF-8"
複数ファイルの例
ConvertEncodeMultiFiles.ps1
#$sourceFile: 変換前のファイル名配列
#$destFile: 変換後のファイルを保存するフォルダ名
#$sourceEncodeName: 変換前のファイルのエンコード
#$destEncodeName: 変換後のファイルのエンコード
Param([array] $sourceFile, [string] $destFile, [string] $sourceEncodeName, [string] $destEncodeName)
#エンコードの取得
[System.Text.Encoding] $encS = [System.Text.Encoding]::GetEncoding($sourceEncodeName)
[System.Text.Encoding] $encD = [System.Text.Encoding]::GetEncoding($destEncodeName)
#どういう変換をしたかを示すログ
"変換:" + $encS.EncodingName + " >>> " + $encD.EncodingName
#カレントディレクトリの取得
$currentPath = Get-Location
#カレントディレクトリの対処
if($destFile -eq "." -or $destFile -eq ".`\")
{
$destFile = $currentPath
}
#出力先のパスの整形
if($destFile.StartsWith(".") -eq $true)
{
$destFile = $destFile.Substring(1)
$destFile = $currentPath.Path + $destFile
}
if($destFile.EndsWith("`\") -eq $false)
{
$destFile = $destFile + "`\"
}
#変換前のファイル数だけループ
#変換後のファイル名は元のファイル名と一緒になります。
ForEach($s in $sourceFile)
{
#ファイルのパスの整形
if($s.StartsWith(".") -eq $true)
{
$s = $s.Substring(1)
$s = $currentPath.Path + $s
}
#ファイル名の取得
$fileName = [System.IO.Path]::GetFileName($s)
$d = $destFile + $fileName
#ファイル名のログ
"ファイル:" + $s + " >>> " + $d
#変換処理
[System.IO.StreamReader] $reader = New-Object System.IO.StreamReader($s, $encS)
[string] $data = $reader.ReadToEnd()
$reader.Close()
[System.IO.StreamWriter] $writer = New-Object System.IO.StreamWriter($d, $false, $encD)
$writer.Write($data)
$writer.Close()
"変換終了"
}
"全部の変換終了"
実行例は次のような感じです。
$fileList = Get-ChildItem -Filter *.html | ForEach-Object{$_.FullName}
.\ConvertEncodeMultiFiles.ps1 $fileList .\DestinatioFolder "Shift-JIS" "UTF-8"
