2

2つのフォルダー構造を比較して、日付とサイズが一致しないファイルを見つけ始めましたが、要件が4つのフォルダーに変更され、スタックしています。

これが私がやろうとしていることです:数百のフォルダ\ファイルを4つの異なるサーバーにアップロードします。ファイルはすべて一致する必要があります。ファイルが正しくコピーされない場合があります。したがって、4つのディレクトリすべてを読み取り、すべてのファイルを比較して、サイズと日付が一致していることを確認するスクリプトが必要です。出力は、一致しなかったファイルを表示する単純なリストのみである必要があります。

何か案は?ありがとう。

私は2つのフォルダーを作成できますが、4つで失われます。また、この出力は紛らわしいです。一致しないものだけをリストする方法がわからない。

    $path1 = "\\path\folder
    $path2 = "\\path\folder1
    $dif = Compare-Object -ReferenceObject $path1 -DifferenceObject $path2 -Property FullName, Length, LastWriteTime
    $dif | ft -AutoSize 
4

2 に答える 2

0

これを試して:

はマスターロケーションでPrimaryPathなければならないことに注意してください (内容は正しいです)。また、パスの書き方に一貫性を持たせてください (を含めるかどうか\)。元。c:\folders\folder1\すべてのパスに使用するか、 c:\folders\folder1.

比較.ps1

Param( 
    [parameter(Mandatory=$true)] [alias("p")] [string]$PrimaryPath,
    [parameter(Mandatory=$true)] [alias("c")] [string[]]$ComparePath
    ) 

#Get filelist with relativepath property
function Get-FilesWithRelativePath ($Path) {
    Get-ChildItem $Path -Recurse | ? { !$_.PSIsContainer } | % { 
        Add-Member -InputObject $_ -MemberType NoteProperty -Name RelativePath -Value $_.FullName.Substring($Path.Length)
        $_
    }
}

#If path exists and is folder
if (Test-Path $PrimaryPath -PathType Container) {
    #Get master fileslist
    $Masterfiles = Get-FilesWithRelativePath (Resolve-Path $PrimaryPath).Path

    #Compare folders
    foreach ($Folder in $ComparePath) {
        if (Test-Path $Folder -PathType Container) {
            #Getting filelist and adding relative-path property to files
            $ResolvedFolder = (Resolve-Path $Folder).Path
            $Files = Get-FilesWithRelativePath $ResolvedFolder

            #Compare and output filepath to missing or old file
            Compare-Object -ReferenceObject $Masterfiles -DifferenceObject $Files -Property RelativePath, Length, LastWriteTime | ? { $_.SideIndicator -eq "<=" } | Select @{n="FilePath";e={Join-Path $ResolvedFolder $_.RelativePath}}
        } else { Write-Error "$Folder is not a valid foldername. Foldertype: Compare" }
    }

} else { Write-Error "$PrimaryPath is not a valid foldername. Foldertype: Master" }
于 2013-01-21T23:24:02.690 に答える
0

私はハッシュベースのアプローチでそれを行い、おそらくデータベーステーブルを使用して自分自身を助けます。ところで、PSCXには、Get-Hashこれを行うのに役立つコマンドレットがあります。

基本的な考え方

各サーバーの目的のフォルダー ツリーをトラバースし (ネットワーク共有ではなく、パフォーマンス上の理由から関係するサーバーでこれを実行する必要があります)、見つけた各ファイルのハッシュを生成しますハッシュとフル パスとサーバー名をどこかに保存します。できれば、4 つのサーバーすべてからアクセスできるデータベース テーブルに保存してください。これにより、処理がはるかに簡単になります。

次に、データベース テーブルを使用したことがある場合は、いくつかの簡単なクエリを記述します。

  1. ハッシュのインスタンスが 4 つ未満のハッシュを見つけます。
  2. ハッシュが異なるファイル パスを検索します (パス文字列を処理して、サーバーごとに同じ相対ルートに到達させる必要がある場合があります) (ただし、これは上記の 1. でカバーされる場合があります)。

もちろん、これらはすべて PS 内から実行できます。

このやり方が役立つ理由

  1. 4 方向の Compare-Object を実行する必要はありません。ハッシュは比較のポイントとして機能します。
  2. ハッシュを生成する Powershell コードは、各サーバーで実行される 1 つの同一の関数です。
  3. それはスケーリングします。100 個のフォルダーに対してこれを簡単に行うことができます。
  4. つまり、関連するサーバーにアクセスできるデータベーステーブルなど、簡単に操作および「配布」できるものになります。

欠点

PSCX Get-Hash はあまり高速ではありません。これは、PSにこの md5sums などの高速なハッシュ生成コマンドを発行させることで簡単に解決できます。

データベース テーブルを使用しない方法
1. ハッシュのフォルダーを処理しているときに、ハッシュ、ファイル パス、サーバー名を各サーバーのファイルに書き込み、完了したらそれらのファイルを元に戻します。
2. ハッシュコードをキーにして各ハッシュコードをカウントするハッシュテーブルにファイルを処理します。3. 各ハッシュ コードをキーにして、そのハッシュ コードのパス/サーバーの配列を作成する並列ハッシュ テーブルを作成できます (2. 結果ファイルを通過するときに同時に構築されます)。
4. ハッシュ テーブル 1 でカウントが 4 未満のハッシュ コードを探します。並列ハッシュ テーブル 2 を使用して、カウントが 4 未満のハッシュ コードを検索し、ファイル パスとサーバーが何であるかを調べます。そうだった。

于 2013-01-21T22:35:31.480 に答える