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 )