Como faço para diferenciar duas pastas no Windows Powershell?

10

Estou tentando encontrar diferenças no conteúdo de duas estruturas de pastas usando o Windows Powershell. Eu usei o seguinte método para garantir que os nomes dos arquivos sejam os mesmos, mas este método não me diz se o conteúdo dos arquivos é o mesmo:

$firstFolder = Get-ChildItem -Recurse folder1
$secondFolder = Get-ChildItem -Recurse folder2
Compare-Object -ReferenceObject $firstFolder -DifferenceObject $secondFolder

A técnica descrita em esta pergunta ServerFault funciona para diferenciar um único arquivo, mas essas pastas contêm centenas de arquivos em diversas profundidades.

A solução não precisa necessariamente me dizer o que especificamente nos arquivos é diferente - apenas que eles são. Não estou interessado em diferenças em metadados, como data, que eu já sei ser diferente.

    
por David Smith 19.08.2013 / 18:01

4 respostas

12

Se você quiser agrupar a comparação em um loop, utilizarei a seguinte abordagem:

$folder1 = "C:\Users\jscott"
$folder2 = "C:\Users\public"

# Get all files under $folder1, filter out directories
$firstFolder = Get-ChildItem -Recurse $folder1 | Where-Object { -not $_.PsIsContainer }

$firstFolder | ForEach-Object {

    # Check if the file, from $folder1, exists with the same path under $folder2
    If ( Test-Path ( $_.FullName.Replace($folder1, $folder2) ) ) {

        # Compare the contents of the two files...
        If ( Compare-Object (Get-Content $_.FullName) (Get-Content $_.FullName.Replace($folder1, $folder2) ) ) {

            # List the paths of the files containing diffs
            $_.FullName
            $_.FullName.Replace($folder1, $folder2)

        }
    }   
}

Note que isto irá ignorar arquivos que não existem em ambos $folder1 e $folder2 .

    
por 19.08.2013 / 19:18
5

Eu peguei a resposta do jscott e a expandi para gerar os arquivos que estão presentes em um, mas não no outro, para aqueles que estão interessados nesse tipo de funcionalidade. Por favor, note também mostra o progresso feito, uma vez que foi difícil para mim ver que, dadas as pastas enormes, com não muitas diferenças. Parecia que o roteiro estava pendurado para mim. Aqui está o código do powershell para isso:

$folder1 = "C:\Folder1"
$folder2 = "C:\Folder2"

# Get all files under $folder1, filter out directories
$firstFolder = Get-ChildItem -Recurse $folder1 | Where-Object { -not $_.PsIsContainer }

$failedCount = 0
$i = 0
$totalCount = $firstFolder.Count
$firstFolder | ForEach-Object {
    $i = $i + 1
    Write-Progress -Activity "Searching Files" -status "Searching File  $i of     $totalCount" -percentComplete ($i / $firstFolder.Count * 100)
    # Check if the file, from $folder1, exists with the same path under $folder2
    If ( Test-Path ( $_.FullName.Replace($folder1, $folder2) ) ) {
        # Compare the contents of the two files...
        If ( Compare-Object (Get-Content $_.FullName) (Get-Content $_.FullName.Replace($folder1, $folder2) ) ) {
            # List the paths of the files containing diffs
            $fileSuffix = $_.FullName.TrimStart($folder1)
            $failedCount = $failedCount + 1
            Write-Host "$fileSuffix is on each server, but does not match"
        }
    }
    else
    {
        $fileSuffix = $_.FullName.TrimStart($folder1)
        $failedCount = $failedCount + 1
        Write-Host "$fileSuffix is only in folder 1"
    }
}

$secondFolder = Get-ChildItem -Recurse $folder2 | Where-Object { -not $_.PsIsContainer }

$i = 0
$totalCount = $secondFolder.Count
$secondFolder | ForEach-Object {
    $i = $i + 1
    Write-Progress -Activity "Searching for files only on second folder" -status "Searching File  $i of $totalCount" -percentComplete ($i / $secondFolder.Count * 100)
    # Check if the file, from $folder2, exists with the same path under $folder1
    If (!(Test-Path($_.FullName.Replace($folder2, $folder1))))
    {
        $fileSuffix = $_.FullName.TrimStart($folder2)
        $failedCount = $failedCount + 1
        Write-Host "$fileSuffix is only in folder 2"
    }
}
    
por 17.10.2014 / 13:27
3

Você acabou de enrolar um loop em torno da resposta correta da sua pergunta vinculada que já respondeu isso, e percorrer a árvore de diretórios comparando todos os arquivos com o mesmo nome.

/ Edit: Se essa é realmente a sua pergunta, é mais apropriado para o SO, onde você parece ser um colaborador regular. Você está fazendo uma pergunta de programação. Eu entendo que você está fazendo isso para um propósito do tipo sysadmin, nesse caso, eu diria para você usar uma ferramenta específica como o WinDiff.

    
por 19.08.2013 / 18:10
0

Faça isso:

compare (Get-ChildItem D:\MyFolder\NewFolder) (Get-ChildItem \RemoteServer\MyFolder\NewFolder)

E até recursivamente:

compare (Get-ChildItem -r D:\MyFolder\NewFolder) (Get-ChildItem -r \RemoteServer\MyFolder\NewFolder)

e é até difícil de esquecer :)

    
por 27.09.2018 / 01:39