Batch renomeia arquivos recuperados pelo Photorec com seus valores de offset

0

Recuperei cerca de 300 arquivos MKV de um disco rígido de 4 TB, usando o Photorec. Esses arquivos são nomeados de acordo com seu primeiro setor, por exemplo "f123456789.mkv". Agora, eu quero renomeá-los todos, adicionando seus valores de início e fim de deslocamento correspondentes, como este: "[63209875968-70209875967] f123456789.mkv" (para um tamanho de arquivo de 7000000000 bytes, neste exemplo). Eu tentei este script em lote:

for %%F in (f*.mkv) do (
    SET name=%%~nF
    SET sectors=%name:~1%
    SET /a offset1=%sectors%*512
    SET /a offset2=%offset1%+%%~zF-1
    RENAME "%%F" "[%offset1%-%offset1%] %%F"
)

Mas isso não funciona, embora os comandos individuais funcionem dentro do CMD; as variáveis não são expandidas corretamente. Eu tentei com "setlocal enabledelayedexpansion" e! Variável! em vez de% variable%, sem sucesso. Além disso, eu li que os cálculos no CMD estavam limitados a uma precisão de 32 bits, então se eu acertar, usando o comando batch / a, eu poderia calcular os deslocamentos até 4294967296 de qualquer maneira (mesmo que o primeiro arquivo não seja suficiente) . O que significa que eu deveria usar outra linguagem de script, mas qual deles seria apropriado, e como eu poderia encontrar rapidamente o comando correspondente para fazer o que eu quero fazer? Passei a maior parte da tarde tentando obter os fundamentos do PowerShell e adaptar o script acima, mas até agora só consegui imprimir os nomes dos arquivos e remover o primeiro caractere ... (É bastante frustrante, considerando que com a mesma quantidade de vez que eu poderia ter feito essa tarefa manualmente e pode ser concluído até agora! É mais propenso a erro, outra razão pela qual eu gostaria de automatizá-lo ...) Eu só preciso:

  • define uma variável com o primeiro número do setor, obtido a partir do nome do arquivo,
  • define uma variável para o primeiro valor de deslocamento, que é o número do setor multiplicado por 512,
  • define uma variável para o último valor de deslocamento, que é o primeiro deslocamento mais o tamanho do arquivo menos 1,
  • renomeie os arquivos usando o padrão mencionado acima.

Alguma ideia? Obrigado!

atualização 1

Então, depois de mais uma noite de desajeitado com o Powershell, acho que acertei algumas coisas. Os primeiros passos parecem funcionar bem, mas recebo erro indecifrável após erro indecifrável quando se trata realmente de renomear os arquivos. O que há de errado com o comando Rename-Item abaixo? E há maneiras de fazer isso de maneira mais simples / elegante?

foreach ($file in gci *.mkv) {
  $sectors = [string]($file.BaseName).substring(1)
  $offset1 = [int64]$sectors * 512
  $offset2 = [int64]$offset1 + [int64]($file.Length) - 1
  Rename-Item -NewName {"[$offset1-$offset2]" $file}
}

atualização 2

Eu resolvi isso corrigindo a última linha assim:

Rename-Item $file -NewName ( "[$offset1-$offset2] " + $file.name )
    
por GabrielB 16.10.2016 / 22:28

1 resposta

0

O loop ForEach que você postou parece correto, pois atinge suas metas, com exceção da linha Rename-Item . Deve ser:

Rename-Item $file -NewName $offset1"-"$offset2".mkv"

Para encontrar mais informações sobre um cmdlet e sua sintaxe, use Get-Help Remove-Item -full . Você encontrará detalhes estendidos junto com exemplos úteis.

    
por 17.10.2016 / 15:26