Ersetzen Sie Dateien, die kleiner als 1 KB sind, aus dem Backup

Ersetzen Sie Dateien, die kleiner als 1 KB sind, aus dem Backup

Ich muss Backups verwenden, um beschädigte Dateien in einem freigegebenen Ordner zu ersetzen. Alle beschädigten Dateien haben eine feste Größe von 1 KB und das Archivierungsflag ist gesetzt. Grundsätzlich möchte ich Dateien im Zielordner nur dann durch Dateien aus Backups ersetzen, wenn die Zieldatei <= 1 KB groß ist und/oder das Archivierungsflag gesetzt ist.

Robocopy scheint hierfür ein mögliches Tool zu sein, aber ich sehe keine Option, es an die Zieldatei anzupassen. Ein anderes Tool, das dies zu können scheint, ist Powershell, aber damit bin ich nicht vertraut.

Wie kann ich dies mit einem der Programme erreichen?

Antwort1

Powershell-Lösung, kann beschädigte Dateien melden und/oder wiederherstellen:

# Use full paths!
$Backup = '\\server\backup'
$Corrupted = 'c:\broken_folder'

# Path for log file, can be relative
$LogFile = '.\Restore.log'

# If this variable is set to true, no files will be copied
$ReportOnly = $true

# Remove log file, if exist
if(Test-Path -Path $LogFile -PathType Leaf)
{
    Remove-Item -Path $LogFile -Force
}

# Get all files in directory, recursive
$Corrupted | Get-ChildItem -Recurse |
    # Select files with archive attribute: $_.Mode -like '*a*'
    # And size less or equal to 1KB: ($_.Length / 1KB) -le 1 . Less fancy way: $_.Length -le 1024
    # Ignore folders: -not $_.PsIsContainer
    #
    # In PS 3.0 and higher Get-ChildItem has less cryptic way to get folders and specify attributes:
    # http://www.powershellmagazine.com/2012/08/27/pstip-how-to-get-only-files-the-powershell-3-0-way
    Where-Object {($_.Mode -like '*a*') -and (($_.Length / 1KB) -le 1) -and (-not $_.PsIsContainer)} |
        ForEach-Object {
            # Output log record to pipeline, Tee-Object will catch it later
            "Found corrupted file: $($_.FullName)"

            # Replace current file path with path fo this file in backup folder
            $NewFile =  $_.FullName -replace [regex]::Escape($Corrupted), $Backup

            if(Test-Path -Path $NewFile -PathType Leaf)
            {
                # Output log record to pipeline, Tee-Object will catch it later
                "Found corresponding file from backup: $NewFile"
            }
            else
            {
                # Output log record to pipeline, Tee-Object will catch it later
                "Failed to find corresponding file from backup: $NewFile"
                return
            }

            if(-not $ReportOnly)
            {
                # Output log record to pipeline, Tee-Object will catch it later
                "Restoring file from backup: $NewFile -> $($_.FullName)"

                # Remove corrupted file
                Remove-Item -Path $_.FullName -Force

                # Copy file from backup
                Copy-Item -Path $NewFile -Destination $_.FullName -Force
            }
        } | Tee-Object -FilePath $LogFile -Append # Send log to screen and file

Antwort2

Robocopy verfügt über die Parameter, die Sie benötigen. Zum Beispiel:

/A :: kopiert nur Dateien, bei denen das Archivattribut gesetzt ist.

/M :: kopiert nur Dateien mit dem Archivattribut und setzt es zurück.


/MAX:n :: Maximale Dateigröße – schließt Dateien aus, die größer als n Bytes sind.

/MIN:n :: Minimale Dateigröße – schließt Dateien aus, die kleiner als n Bytes sind.

Hier ist eine Liste aller Befehle: https://wmoore.wordpress.com/2009/09/01/robocopy-command-line-switches/

verwandte Informationen