【Windows】ファイルサーバ移行検証_データコピー状況確認について

PowerShell

はじめに

前回ファイルサーバ間のネットワークを通じて、データコピーを実行しました。(ADの場合 / WORKGROUPの場合)

今回はデータコピーが問題なく行われたかを確認する方法を紹介しています。

※本記事は下記のファイルサーバ移行検証の一部です。

構成

既存ファイルサーバ(データのコピー元
ホスト名:filesv-win-01
IPアドレス:172.16.1.137
OS:WindowsServer 2022

新規ファイルサーバ(データのコピー先)
ホスト名:filesv-win-02
IPアドレス:172.16.1.138
OS:WindowsServer 2022

ADサーバ
ホスト名:adsv01
IPアドレス:172.16.1.67
OS:WindowsServer 2022

データ比較スクリプト

以下のスクリプトはリモート環境で共有されている「\\172.16.1.137\share」と、ローカル環境の「E:\share」を比較しています。

# 比較するディレクトリのパス
$sourceDir = "\\172.16.1.137\share"
$destinationDir = "E:\share"

# ログの保存先ディレクトリ
$logDir = "C:\work\log"
# ファイル名に日時を付与
$timestamp = Get-Date -Format "yyyyMMddHHmmss"
$logFile = Join-Path -Path $logDir -ChildPath "ComparisonLog_$timestamp.txt"

# Get-FileHashを使ってファイルのハッシュ値を取得する関数
function Get-FileHashValue {
    param (
        [string]$filePath
    )
    if (Test-Path $filePath) {
        return (Get-FileHash -Path $filePath -Algorithm SHA256).Hash
    }
    return $null
}

# ディレクトリのファイル情報を取得する関数
function Get-FileList {
    param (
        [string]$directory
    )
    return Get-ChildItem -Path $directory -Recurse -File | ForEach-Object {
        [PSCustomObject]@{
            Path = $_.FullName.Substring($directory.Length)
            Size = $_.Length
            Hash = Get-FileHashValue $_.FullName
        }
    }
}

# コピー元とコピー先のファイル情報を取得
$sourceFiles = Get-FileList -directory $sourceDir
$destinationFiles = Get-FileList -directory $destinationDir

# 比較のためにハッシュテーブルに変換
$sourceFileHashTable = @{}
$sourceFiles | ForEach-Object {
    $sourceFileHashTable[$_.Path] = $_
}

$destinationFileHashTable = @{}
$destinationFiles | ForEach-Object {
    $destinationFileHashTable[$_.Path] = $_
}

# 結果を格納する変数
$comparisonResults = @()

# ファイルの比較
foreach ($sourceFile in $sourceFiles) {
    $path = $sourceFile.Path
    if ($destinationFileHashTable.ContainsKey($path)) {
        $destinationFile = $destinationFileHashTable[$path]
        $comparisonResults += [PSCustomObject]@{
            Path = $path
            SourceSize = $sourceFile.Size
            DestinationSize = $destinationFile.Size
            SourceHash = $sourceFile.Hash
            DestinationHash = $destinationFile.Hash
            Match = ($sourceFile.Size -eq $destinationFile.Size) -and ($sourceFile.Hash -eq $destinationFile.Hash)
        }
    } else {
        $comparisonResults += [PSCustomObject]@{
            Path = $path
            SourceSize = $sourceFile.Size
            DestinationSize = 'Not Found'
            SourceHash = $sourceFile.Hash
            DestinationHash = 'Not Found'
            Match = $false
        }
    }
}

# 結果をテキストファイルに保存
$comparisonResults | Format-Table -AutoSize | Out-String | Set-Content -Path $logFile

# 不一致があるかどうかを確認する
$differences = $comparisonResults | Where-Object { -not $_.Match }
if ($differences) {
    $differences | Format-Table -AutoSize | Out-String | Add-Content -Path $logFile
    Write-Host "不一致が見つかりました。詳細はログファイルを参照してください: $logFile" -ForegroundColor Red
} else {
    Write-Host "全てのファイルが一致しています。詳細はログファイルを参照してください: $logFile" -ForegroundColor Green
}

結果は C:\work\log フォルダ内に「ComparisonLog_yyyyMMddHHmmss.txt」として保存されます。

比較方法

以下は結果の一部です。ファイルのハッシュ値を比較しています。

全て一致していれば、末尾に表示してくれます。

スクリプトの検証

比較ができているか試験します。「test_005.txt」を編集して、ハッシュ値を変えます。

元のファイルには何も記載されていませんでしたが、適当なテキストを追記して保存してみます。

実行結果を再確認

再度スクリプトを実行します。
結果、末尾に不一致だったファイルの一覧が出てきています。

ちなみに、フォルダについても同様に検知できます。

以下が結果となります。

認証情報を書き出すより短時間で比較出来ました。実際の現場でも使用できるかは、一度ご自身で検証したうえで、検討いただければと思います。

以上でデータの比較は終わりです。最後はホスト名やIPアドレスを変える作業です。
※要件によっては新規IP、ホスト名を割り当てる場合は当然不要な作業です。

WORKGROUP環境ではデータコピー時にアクセス権の移行はできていないと思います。アクセス権のエクスポートについてはこちら。