Копировать файлы, включая структуру каталогов, только если дата их изменения изменилась - PullRequest
0 голосов
/ 17 октября 2018

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

param([string]$source,[string]$datum)
(Get-ChildItem $source -Recurse | Where-Object { $_.LastWriteTime -ge $datum }) | Copy-Item -Destination C:\tmp -Recurse

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

Где ошибка?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Прежде всего вы должны использовать robocopy для чего-то подобного.Он имеет переключатели, которые, вероятно, обрабатывают ваш запрос:

/ e Копирует подкаталоги.Обратите внимание, что эта опция включает пустые каталоги.Для получения дополнительной информации см. Примечания.

/ maxage: задает максимальный возраст файла (исключая файлы старше N дней или даты).

/ l Указывает, что файлы должны быть указаны только (и не копируется, не удаляется или не имеет отметки времени).

Итак, зная, что я бы начал экспериментировать с robocopy $source $destination /e /maxage:30 /l, в котором должны отображаться все файлы в дереве каталогов, которые были изменены за последние 30 дней./maxage может быть не тот переключатель, который вы ищете, но это справедливое предположение.


Проблема с вашей текущей логикой, вероятно, заключается в том, что Get-ChildItem $source -Recurse будет возвращать папки и файлы.Таким образом, вы можете передать папку в Copy-Item, откуда поступают все дополнительные файлы.Вы должны быть в состоянии смягчить это с помощью переключателя -File.

Get-ChildItem $source -Recurse -File
0 голосов
/ 17 октября 2018

Вот слишком сложное решение.Он имеет много обработки ошибок с 5 повторных попыток.Вы должны быть в состоянии применить его к вашим потребностям.

Я бы посмотрел на Line 21, чтобы добавить Where-Object и проверить его.

Пример использования: Copy-Files -Source "C: \ Path \" -Destination "C: \ Path2 \"

Function Retry-Command {
    $Script:Counter = $Script:Counter + 1
    Write-Host "Attempt #" $Script:Counter "out of 5"
    if ($Script:Counter -ge 5) {
        PAUSE
    }
    else {
        Start-Sleep -Seconds 5 -Verbose
    }
}
Function Copy-Files ([string]$Source, [string]$Destination ) {
    [System.Collections.ArrayList]$Folder_Content = @()
    [string]$Folder_Name = Split-Path $Source -Leaf
    [string]$Folder_Path = ($Source -replace [regex]::Escape($Source), ($Destination + $Folder_Name + "\"))
    [int]$Script:Counter = 0
    while (($Folder_Content.Count -eq "0") -and ($Counter -ne 5)) {
        try {
            Write-Host ""
            Write-Host "------------------------------" -ForegroundColor Cyan
            Write-Host "Getting Content of" $Folder_Name -ForegroundColor Yellow
            [System.Collections.ArrayList]$Folder_Content = @(Get-ChildItem -Path $Source -Recurse -Force -ErrorVariable Child_Error)
            if ((-Not $Child_Error) -and ($Folder_Content.Count -ne 0) ) {
                Write-Host "Finished Getting Content of" $Folder_Name -ForegroundColor Green
                [int]$Script:Counter = 0
            }
            else {
                Write-Host "Failed to get Content of" $Folder_Name -ForegroundColor Red
                Retry-Command
            }  
        }
        catch {
            Write-Host "Unexpected Error getting Content of" $Folder_Name -ForegroundColor Red
            Retry-Command
        }
    }        
    if (-Not $Folder_Content.Count -eq 0) {
        while ((Test-Path -Path $Folder_Path) -eq $false) {
            try {
                Write-Host ""
                Write-Host "Creating" $Folder_Name "Folder" -ForegroundColor Yellow
                Copy-Item -Path $Source -Destination $Folder_Path -Force -ErrorVariable Folder_Error
                if (-Not $Folder_Error) {
                    Write-Host "Finished Creating" $Folder_Name "Folder" -ForegroundColor Green
                    [int]$Script:Counter = 0
                }
                else {
                    Write-Host "Failed to create" $Folder_Name "Folder" -ForegroundColor Red
                    Retry-Command
                }            
            }
            catch {
                Write-Host "Unexpected Error Creating" $Folder_Name "Folder" -ForegroundColor Red
                Retry-Command
            }        
        }
        foreach ($Index in $Folder_Content) {
            [string]$Software_File_Name = Split-Path $Index.FullName -Leaf
            [string]$Software_File_Path = ($Index.FullName -replace [regex]::Escape($Source), ($Destination + (Split-Path $Source -Leaf) + "\"))
            while ((Test-Path -Path $Software_File_Path) -eq $false) {
                try {
                    Write-Host ""
                    Write-Host "Copying" $Index.FullName -ForegroundColor Yellow
                    Copy-Item -Path $Index.FullName -Destination $Software_File_Path -Force -ErrorVariable File_Error
                    if (-Not $File_Error) {
                        Write-Host "Finished Copying" $Index.FullName -ForegroundColor Green
                        [int]$Script:Counter = 0
                    }
                    else {
                        Write-Host "Failed to Copy" $Index.FullName -ForegroundColor Red
                        Retry-Command
                    }
                }
                catch {
                    Write-Host "Unexpected Error Copying" $Index.FullName -ForegroundColor Red
                    Retry-Command
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...