2

我开始比较 2 个文件夹结构以查找日期和大小不匹配的文件,但要求已更改为 4 个文件夹,我被卡住了。

所以这就是我想要做的:我们将数百个文件夹\文件上传到 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可帮助您执行此操作的命令行开关。

基本方法

遍历每个服务器所需的文件夹树(出于性能原因,您希望在所涉及的服务器执行此操作,而不是通过网络共享!)并为您找到的每个文件生成哈希。将散列值、完整路径和服务器名称存储在某处,最好是可从所有四台服务器访问的数据库表——这将使处理变得更加容易。

然后,如果您使用过数据库表,请编写一些简单的查询:

  1. 找到少于 4 个散列实例的任何散列。
  2. 找到具有不同哈希值的任何文件路径(您可能必须处理路径字符串以将其获取到每个服务器的相同相对根目录)(尽管这可能被上面的 1. 覆盖)。

当然,所有这些都可以在 PS 中完成。

为什么这种做事方式可能会有所帮助

  1. 您不必运行四向比较对象。哈希值可作为您的比较点。
  2. 生成哈希的 Powershell 代码是在每台服务器上运行的相同函数。
  3. 它可以扩展。您可以轻松地为 100 个文件夹执行此操作。
  4. 您最终会得到一些易于操作和“分发”的东西,即可以访问所涉及的服务器——数据库表。

缺点

PSCX Get-Hash 不是很快。这可以通过让 PS 触发一些更快的哈希生成命令来轻松解决,例如 md5sums

如何不使用数据库表
1. 在处理散列文件夹时,将散列、文件路径、服务器名写入每台服务器上的文件,并在完成后将这些文件带回。
2. 将文件处理成一个哈希表,该哈希表键入哈希码并计算每个哈希码。3. 您可以有一个并行哈希表(与 2. 同时构建,当您通过结果文件时),将每个哈希码上的键连接到该哈希码的路径/服务器数组。
4. 在哈希表 1 中查找计数小于 4 的哈希码。使用并行哈希表 2 查找计数小于 4 的哈希码,找出文件路径和服务器是。

于 2013-01-21T22:35:31.480 回答