はじめに
前回ファイルサーバ間のネットワークを通じて、データコピーを実行しました。(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」を比較しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# 比較するディレクトリのパス $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」として保存されます。
比較方法
以下は結果の一部です。ファイルのハッシュ値を比較しています。
![](https://www.ricecake24book.com/wp-content/uploads/2024/06/image-135-800x232.png)
全て一致していれば、末尾に表示してくれます。
![](https://www.ricecake24book.com/wp-content/uploads/2024/06/image-136-800x156.png)
スクリプトの検証
比較ができているか試験します。「test_005.txt」を編集して、ハッシュ値を変えます。
![](https://www.ricecake24book.com/wp-content/uploads/2024/06/image-137.png)
元のファイルには何も記載されていませんでしたが、適当なテキストを追記して保存してみます。
![](https://www.ricecake24book.com/wp-content/uploads/2024/06/image-138.png)
実行結果を再確認
再度スクリプトを実行します。
結果、末尾に不一致だったファイルの一覧が出てきています。
![](https://www.ricecake24book.com/wp-content/uploads/2024/06/image-139-800x86.png)
ちなみに、フォルダについても同様に検知できます。
以下が結果となります。
![](https://www.ricecake24book.com/wp-content/uploads/2024/06/image-142-800x121.png)
認証情報を書き出すより短時間で比較出来ました。実際の現場でも使用できるかは、一度ご自身で検証したうえで、検討いただければと思います。
以上でデータの比較は終わりです。最後はホスト名やIPアドレスを変える作業です。
※要件によっては新規IP、ホスト名を割り当てる場合は当然不要な作業です。
WORKGROUP環境ではデータコピー時にアクセス権の移行はできていないと思います。アクセス権のエクスポートについてはこちら。