はじめに
前回ファイルサーバ間のネットワークを通じて、データコピーを実行しました。(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環境ではデータコピー時にアクセス権の移行はできていないと思います。アクセス権のエクスポートについてはこちら。

