Unidade de disco rígido inválida e robocopy

1

Depois que meu disco rígido me deu erros de CRC eu queria para copiar uma unidade para outra e pegou uma nova unidade de disco rígido de 1 TB.

Estou usando o comando:

robocopy G: J: /MIR /COPYALL /ZB

Primeiro, tentei copiar o arquivo algumas vezes (não contei, ele não está mais na minha janela) e recebi um erro de acesso negado, erro 5. Então ele tentou novamente e bloqueou. Eu tentei copiar esse arquivo específico (14 MB) e o Windows diz "não é possível ler do arquivo de origem ou disco".

Eu comecei a fazer o robocopy novamente. Espero que ele irá ignorá-lo depois de uma tentativa de falha ou dois, mas quais opções posso usar para dizer se ele não funciona continuar para o próximo arquivo? Parecia que era isso que estava fazendo, mas para este último repetiu mais de quatro vezes e trancou finalmente.

Estou aberto a outras soluções de cópia. Eu prefiro soluções integradas. Estou usando o Windows 7.

Além disso, como posso fazer isso sem a opção /MIR ? /S /E é bom o suficiente? sinalize a referência aqui

Vejo que posso controlar novas tentativas com / R: < Quantia & gt ;, mas ainda estou aberto a soluções alternativas.

Parece demorar alguns minutos até que a tentativa falhe. Posso encurtá-lo? O arquivo foi preso em 20,8% por um tempo agora.

Eu tentei um aplicativo de recuperação de dados. Ele tentou recuperar os dados e NÃO os marcou como inválidos ou corrompidos. Embora eu tenha recebido uma mensagem dizendo que o setor XYZ tinha um erro de E / S, continue? mas isso não me deu o nome do arquivo corrompido. Eu não quero isso. A melhor solução para mim é obter todos os arquivos bons + nomes de arquivos inválidos.

    
por Journeyman Geek 16.05.2010 / 04:12

4 respostas

1

Como você percebeu, /r:3 fará três tentativas em vez de 1 milhão (!)

/w:10 esperará 10 segundos entre as novas tentativas (o padrão é 30).

Se você estiver fazendo uma cópia local, eu faria duas tentativas com uma espera de 1 segundo entre elas (mantenho a espera de 30 segundos ao fazer cópias de rede no caso de tirar o cabo).

Também não use /mir , pois ele excluirá arquivos no destino que não existem na origem (o que pode ser importante se você executar este comando várias vezes) - /E is suficiente.

Se você estiver usando /copyall , lembre-se de executar o prompt de comando como administrador ou provavelmente não conseguirá definir todas as ACLs corretamente.

Depois, chkdsk /r tentará recuperar arquivos de setores defeituosos.

    
por 16.05.2010 / 18:41
2

Eu escrevi um pequeno script do PowerShell para ignorar os erros de E / S do dispositivo na cópia (e, assim, substituir os dados ilegíveis pelo zero). Uma versão atualizada e mais avançada está disponível aqui . O código que coloquei aqui abaixo é uma das primeiras versões e é o mais simples possível:

## .SYNOPSIS
#########################
## This script copies a file, ignoring device I/O errors that abort the reading of files in most applications.
##
## .DESCRIPTION
#########################
## This script will copy the specified file even if it contains unreadable blocks caused by device I/O errors and such. The block that it can not read will be replaced with zeros. The size of the block is determined by the buffer. So, to optimize it for speed, use a large buffer. T optimize for accuracy, use small buffer, smallest being the cluster size of the partition where your source file resides.
##
## .OUTPUTS
#########################
## Errorcode 0: Copy operation finished without errors.
##
## .INPUTS
#########################
## Blabla..
##
## .PARAMETER SourceFilePath
## Path to the source file.
##
## .PARAMETER DestinationFilePath
## Path to the destination file.
##
## .PARAMETER Buffer
## I makes absolutely no sense to set this less than the cluster size of the partition. Setting it lower than cluster size might force rereading a bad sector in a cluster multiple times. Better is to adjust the retry option. Also, System.IO.FileStream buffers input and output for better performance. (http://msdn.microsoft.com/en-us/library/system.io.filestream.aspx).
##
## .EXAMPLE
## .\Force-Copy.ps1 -SourceFilePath "file_path_on_bad_disk" -DestinationFilePath "destinaton_path"
##
#########################

[CmdletBinding()]
param(
   [Parameter(Mandatory=$true,
              ValueFromPipeline=$true,
              HelpMessage="Source file path.")]
   [string][ValidateScript({Test-Path -LiteralPath $_ -Type Leaf})]$SourceFilePath,
   [Parameter(Mandatory=$true,
              ValueFromPipeline=$true,
              HelpMessage="Destination file path.")]
   [string][ValidateScript({ -not (Test-Path -LiteralPath $_) })]$DestinationFilePath,
   [Parameter(Mandatory=$false,
              ValueFromPipeline=$false,
              HelpMessage="Buffer size in bytes.")]
   [int32]$BufferSize=512*2*2*2 # 4096: the default windows cluster size.
)

Write-Host "Working..." -ForegroundColor "Green";

# Making buffer
$Buffer = New-Object System.Byte[] ($BufferSize);
$UnreadableBits = 0;

# Fetching source and destination files.
$SourceFile = Get-Item -LiteralPath $SourceFilePath;
$DestinationFile = New-Object System.IO.FileInfo ($DestinationFilePath);

# Copying starts here
$SourceStream = $SourceFile.OpenRead();
$DestinationStream = $DestinationFile.OpenWrite();

while ($SourceStream.Position -lt $SourceStream.Length) {
    try {

        $ReadLength = $SourceStream.Read($Buffer, 0, $Buffer.length);
        # If the read operation is successful, the current position of the stream is advanced by the number of bytes read. If an exception occurs, the current position of the stream is unchanged. (http://msdn.microsoft.com/en-us/library/system.io.filestream.read.aspx)

    }
    catch [System.IO.IOException] {

        Write-Warning "System.IO.IOException at $($SourceStream.position) bit: $($_.Exception.message)"
        Write-Debug "Debugging...";

        $ShouldReadSize = [math]::Min([int64] $BufferSize, $SourceStream.Length - $SourceStream.Position);

        $DestinationStream.Write((New-Object System.Byte[] ($BufferSize)), 0, $ShouldReadSize);
        $SourceStream.Position = $SourceStream.Position + $ShouldReadSize;

        $UnreadableBits += $ShouldReadSize;

        continue;
    }
    catch {
        Write-Warning "Unhandled error at $($SourceStream.position) bit: $($_.Exception.message)";
        Write-Debug "Unhandled error. You should debug.";
        throw $_;
    }

    $DestinationStream.Write($Buffer, 0, $ReadLength);
    # Write-Progress -Activity "Hashing File" -Status $file -percentComplete ($total/$fd.length * 100)
}

$SourceStream.Dispose();
$DestinationStream.Dispose();

if ($UnreadableBits -ne 0) {Write-Host "$UnreadableBits bits are bad." -ForegroundColor "Red";}

Write-Host "Finished copying $SourceFilePath!" -ForegroundColor "Green";
    
por 02.06.2013 / 19:27
0

Você ficará melhor usando ferramentas de recuperação de dados, como GetDataBack , que estão cientes da falha da unidade e esperará leituras com falha.

    
por 16.05.2010 / 04:27
0

Eu uso o robocopy para todas as minhas transferências de backup entre dispositivos. Como a cópia / colagem normal não é confiável e alguns aplicativos não permitem pausar ou continuar onde a cópia falhou.

destino de origem de robocopy / e / XO / copy: DAT / r: 3 / w: 5

Ou encurte a repetição e espere períodos.

Na experiência / e é a melhor opção do que / MIR e então você não precisaria de / s

Além disso, se sua cópia foi interrompida por qualquer motivo, use o / XO para pular arquivos já copiados.

Se você precisar de um log dos arquivos em txt use /log+:Files.log

Útil se for mídia.

Há muito mais opções em TechNet

    
por 29.09.2017 / 13:30