Substituir arquivos menores que 1KB do backup

0

Eu preciso usar backups para substituir arquivos corrompidos em uma pasta compartilhada. Todos os arquivos corrompidos são de tamanho fixo = 1 KB e têm o sinalizador de arquivo morto definido. Basicamente, eu gostaria de substituir arquivos na pasta de destino com arquivos de backups apenas se o arquivo de destino for < = 1KB e / ou tiver o sinalizador de arquivo morto configurado.

O Robocopy parece uma possível ferramenta para isso, mas não vejo uma opção para condicioná-lo no arquivo de destino. Outra ferramenta que parece fazer isso é o Powershell, mas eu não estou familiarizado com isso.

Como posso fazer isso com qualquer programa?

    
por Szafa 24.03.2015 / 16:38

2 respostas

1

Solução Powershell, pode reportar e \ ou restaurar arquivos corrompidos:

# 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
    
por 24.03.2015 / 18:08
1

O Robocopy tem os parâmetros de que você precisa. Por exemplo:

/ A :: copiar apenas arquivos com o conjunto de atributos do arquivo.

/ M :: copie apenas arquivos com o atributo Archive e redefina-o.

/ MAX: n :: Tamanho máximo do arquivo - exclua arquivos maiores que n bytes.

/ MIN: n :: Tamanho mínimo do arquivo - exclua arquivos menores que n bytes.

Aqui está uma lista de todos os comandos: link

    
por 24.03.2015 / 17:41