
Recuperei cerca de 300 arquivos MKV de um HDD de 4 TB, usando Photorec. Esses arquivos são nomeados de acordo com seu primeiro setor, por exemplo "f123456789.mkv". Agora, quero renomear todos eles adicionando seus valores de deslocamento inicial e final 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 não funciona, embora os comandos individuais funcionem no CMD ; as variáveis não são expandidas corretamente. Tentei com "setlocal enabledelayeexpansion" e !variable! em vez de% variável%, sem sucesso. Além disso, li que os cálculos no CMD eram limitados a uma precisão de 32 bits; portanto, se acertar, usando o comando em lote set /a, só poderia calcular deslocamentos até 4294967296 de qualquer maneira (mesmo para o primeiro arquivo, isso não é suficiente) . O que significa que devo usar outra linguagem de script, mas qual seria apropriada e como poderia encontrar rapidamente o comando correspondente para fazer o que desejo? Passei a maior parte da tarde tentando entender o básico 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 ela pode estar concluída agora. Porém, é mais propenso a erros, outro motivo pelo qual eu gostaria de automatizá-la...) Eu só preciso:
- defina uma variável com o primeiro número do setor, obtido do nome do arquivo,
- definir uma variável para o primeiro valor de deslocamento, que é o número do setor multiplicado por 512,
- defina 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.
Qualquer ideia ? Obrigado !
atualização 1
Então, depois de mais uma noite de brincadeiras desajeitadas com o Powershell, acho que acertei algumas coisas. As primeiras etapas parecem funcionar bem, mas recebo erros indecifráveis após erros indecifráveis quando se trata de renomear os arquivos. O que há de errado com o comando Rename-Item abaixo? E existem maneiras de fazer isso de forma 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 )
Responder1
O ForEach
loop que você postou parece correto porque atinge seus objetivos, exceto a Rename-Item
linha. Deveria 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.