朧の.Netの足跡
問合せ先:support@oborodukiyo.info サイト内検索はこちら 
PowerShell テキスト形式のファイルのエンコードを変換するスクリプト





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








良いやや良い普通やや悪い悪い

投稿日時評価コメント