atualização 1

atualização 1

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 ForEachloop que você postou parece correto porque atinge seus objetivos, exceto a Rename-Itemlinha. 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.

informação relacionada