Как делают меня разность две папки в Windows Powershell?

  1. перезапуск rsyslog:

    Сервис $sudo rsyslog перезапуск

  2. Используйте эхо, затем не имейте для перезапуска rsyslog

    $sudo повторяют-n>/var/log/file_which_is_big

11
задан 13 April 2017 в 15:14
5 ответов

Если вы хотите заключить сравнение в цикл, я бы применил следующий подход:

$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)

        }
    }   
}

Обратите внимание, что при этом будут игнорироваться файлы, которые не существуют в обоих $ folder1 и $ folder2 .

13
ответ дан 2 December 2019 в 21:47

Вы просто оборачиваете цикл вокруг правильного ответа из связанного вопроса, который уже ответил на него, и проходите по дереву каталогов, сравнивая каждый файл с тем же именем.

/ Edit: Если это действительно ваш вопрос, он больше подходит для SO, где вы, кажется, являетесь постоянным участником. Вы задаете вопрос по программированию. Я понимаю, что вы делаете это для целей типа системного администратора, и в этом случае я бы посоветовал вам использовать специальный инструмент, такой как WinDiff.

1
ответ дан 2 December 2019 в 21:47

Я взял ответ jscott и расширил его, чтобы вывести файлы, которые присутствуют в одном, но не в другом, для тех, кто интересуется такими функциями. Обратите внимание, что он также показывает достигнутый прогресс, поскольку мне было трудно это увидеть, учитывая огромные папки с небольшими отличиями. Похоже, сценарий мне повесили. Вот код PowerShell для этого:

$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"
    }
}
5
ответ дан 2 December 2019 в 21:47

Сделайте это:

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

И даже рекурсивно:

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

и даже трудно забыть :)

0
ответ дан 2 December 2019 в 21:47

Следующая функция рекурсивно проверяет несколько папок (хотя и две одновременно) на наличие удалений (только в первой), добавлений (только во второй) И изменений (где файлы с одинаковыми именами имеют разные content)

'folder1','folder2' | DiffFolders

Функция:

Function DiffFolders {
    Begin {
        $last = $NULL
    }
    Process {
        $current = @{}
        $unchanged = 0
        
        $parent = $_
        $parentPath = (Get-Item -Path $parent).FullName
        $parentRegex = "^$([regex]::escape($parentPath))"
        Get-ChildItem -Path $parentPath -Recurse -File `
        | %{
            $name = $_.FullName -replace $parentRegex,''
            $current.Add($name, (Get-FileHash -LiteralPath $_.FullName).Hash)
            
            if (!$last) {
                return
            }
            
            if (!$last.Contains($name)) {
                [PSCustomObject]@{
                    parent = $parent
                    event = 'Added'
                    value = $name
                }
                return
            }
            
            if ($last[$name] -eq $current[$name]) {
                ++$unchanged
            }
            else {
                [PSCustomObject]@{
                    parent = $parent
                    event = 'Changed'
                    value = $name
                }
            }
            $last.Remove($name)
        }
        
        if ($last) {
            [PSCustomObject]@{
                parent = $parent
                event = 'Unchanged'
                value = $unchanged
            }
            $last.Keys `
            | %{
                [PSCustomObject]@{
                    parent = $parent
                    event = 'Deleted'
                    value = $_
                }
            }
        }
        
        $last = $current
    }
}

Вот аккуратная демонстрация, которая должна быть на большинстве машин с Win10:

PS C:\Program Files\WindowsApps> gci 'Microsoft.NET.Native.Runtime.*_x64__8wekyb3d8bbwe' | %{ $_.Name }
Microsoft.NET.Native.Runtime.1.7_1.7.25531.0_x64__8wekyb3d8bbwe
Microsoft.NET.Native.Runtime.1.7_1.7.27422.0_x64__8wekyb3d8bbwe
Microsoft.NET.Native.Runtime.2.1_2.1.26424.0_x64__8wekyb3d8bbwe
Microsoft.NET.Native.Runtime.2.2_2.2.27011.0_x64__8wekyb3d8bbwe
Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_x64__8wekyb3d8bbwe
PS C:\Program Files\WindowsApps> gci 'Microsoft.NET.Native.Runtime.*_x64__8wekyb3d8bbwe' | %{ $_.Name } | DiffFolders | Out-GridView

Мы можем точно видеть, в каких версиях файлы были добавлены и удалены из среды выполнения .NET, и которые были изменены.
Неизмененные файлы не упоминаются, но подсчитываются для краткости (обычно у вас будет гораздо больше неизменных файлов, чем измененных, я думаю).

enter image description here

Также работает в Linux, для тех, кто использует PowerShell там :)

Для любопытных, неизмененные файлы были clrcompression.dll,logo.png, logo.png , logo.png и logo.png

0
ответ дан 3 November 2020 в 12:08

Теги

Похожие вопросы