[PowerShell]文字コードUTF-8,改行コードLFのファイル一覧を取得する

はじめに

ファイルの同一性チェックを行うため、ファイル一覧と同時に「ファイルのハッシュ値MD5ハッシュ)」を取得する方法は以下の通りです。

前回は、出力ファイルをwindowsの差分比較ツール(WinMergeなど)にかけることを想定し、文字コード「S-JIS」、改行コード「CRLFで出力しました。
今回は、出力ファイルをLinuxの「md5sum」コマンドのinputに使用することを想定し、文字コード「UTF-8」、改行コード「LFで出力してみたいと思います。

スクリプト

ソースコード

fileListForMd5sum.ps1

# fileListWithMD5.ps1
#  指定のフォルダ配下のファイル一覧を作成する

param($targetDir)

# ISEでの実行用に引数がない場合に初期値を設定する
if($targetDir -eq $null){ $targetDir = '\\file-sever\targetDir' }    # 適宜コメントアウト

# 出力するファイル一覧のファイル名
$OutFile = ".\fileListForMd5sum.txt"
$tempOutFile = ".\fileListForMd5sumTemp.txt"

# パラメタチェック
if ($targetDir -eq $null) {
    Write-Host "引数が足りません。(引数1:フルパスのフォルダ名)処理を中止します。"
    exit 1
}

# フォルダの存在チェック
if (!(Test-Path $targetDir)) {
    Write-Host "フォルダが存在しません。処理を中止します。"
    exit 1
}

# ファイル一覧作成
#  1.フルパスのファイル一覧を取得
#  2.昇順でソート
#  3.MD5ハッシュを取得し半角スペース区切りで連結
#  4.デフォルトの文字コード(SJIS)でファイル出力
try {

    Write-Host ("---ファイル一覧作成中---")
    $FileList = dir $targetDir -Recurse -Name -File | Sort-Object  

    $FileListWithMd5 = @();

    # 取得したファイルリストに対し1件つずつMD5ハッシュを取得する
    foreach($oneFile in $FileList){

        # パス+\+ファイル+半角スペース+MD5ハッシュ

        # ファイル毎にMD5ハッシュを取得し、半角スペース区切りで結合する
        $dirAndFile = $targetDir + "\" + $fileList[$j]
        $LinuxFile = $fileList[$j] -replace "\\" , "/"
        $FileListWithMd5 += @((Get-FileHash -Algorithm md5 $dirAndFile).Hash + "  " +  "/" + $LinuxFile)

    }
    
    # 改行コードCRLF、文字コードS-JISでファイルに出力する
    Out-File -InputObject $FileListWithMd5 -FilePath $tempOutFile -Encoding default

    # 改行コードをLFにする
    $LfFile = (Get-Content $tempOutFile -Encoding default) -join "`n"
    # 文字コードをBOM無しUTF-8に変換する
    $Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
    [System.IO.File]::WriteAllText($OutFile, $LfFile, $Utf8NoBomEncoding)

    # tempファイルを削除する
    Remove-Item $tempOutFile

    Write-Host ("---ファイル一覧作成完了---")

} catch [Exception] {
    $exp = $error[0].ToString()
    Write-Host ($exp)
}

処理の流れ

  1. Out-File文字コードS-JIS」、改行コードCRLF」でファイルに出力する
  2. Get-Contentでファイルを行単位に読み込み、-joinで「`n(LF)」で連結する
  3. Set-Content文字コードを「UTF-8」に設定して再度ファイルに出力する
    この時、最後にCRLFが入らないように-NoNewlineとする

出力形式

出力ファイルをLinuxの「md5sum」コマンドのinputに使用するため、出力形式は「MD5ハッシュ値」と「ファイル名」を半角スペース2つで区切って出力します。

出力形式:MD5ハッシュ+△△+ファイル名
(△:半角スペース)

実行方法

Windowsコマンドプロンプトで以下のコマンドを実行します。

powershell -NoProfile -ExecutionPolicy RemoteSigned .\fileListForMd5sum.ps1 \\file-sever\targetDir

ファイル同一性チェックの手順

今回出力したファイル使って、以下のようなことが出来ます。

  • ファイルをあるサーバにリリースした時、リリースしようとしているものが正しくリリースできているか確認する(ファイル同一性チェック
  • 手順
  1. Windows端末で対象資材の「MD5付きファイル一覧」を作成する
  2. Windows端末からLinuxサーバに「資材」と共に「MD5付きファイル一覧」を転送する
  3. 資材をLinuxサーバの各ディレクトリにリリースする
  4. Linuxサーバで以下のコマンドを打ち、「MD5付きファイル一覧」とサーバの実際の資材の同一性チェックをする
md5sum -c <MD5付きファイル一覧>

参考情報

追記

ファイル出力箇所について、当初以下のようにコーディングしましたが

# 改行コードCRLF、文字コードS-JISでファイルに出力する
Out-File -InputObject $FileListWithMd5 -FilePath $tempOutFile -Encoding default

# 改行コードをLFに変換した後、文字コードをUTF-8にして再度ファイルに出力する
(Get-Content $tempOutFile -Encoding defalut) -join "`n" | Set-Content $OutFile -NoNewline -Encoding UTF-8

これだとBOMが付いてしまい、md5sumで1行目が必ず書式エラーとなってしまいます。
そのためBOM無しUTF-8ファイルを出力するように、以下のように変更しました。

# 改行コードCRLF、文字コードS-JISでファイルに出力する
Out-File -InputObject $FileListWithMd5 -FilePath $tempOutFile -Encoding default

# 改行コードをLFにする
$LfFile = (Get-Content $tempOutFile -Encoding default) -join "`n"
# 文字コードをBOM無しUTF-8に変換する
$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
[System.IO.File]::WriteAllText($OutFile, $LfFile, $Utf8NoBomEncoding)

コメント

タイトルとURLをコピーしました