テキスト形式のファイルのエンコードを変換するスクリプトです。
スクリプトは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"