actualización 1

actualización 1

Recuperé alrededor de 300 archivos MKV de un disco duro de 4 TB usando Photorec. Esos archivos se nombran según su primer sector, por ejemplo "f123456789.mkv". Ahora, quiero cambiarles el nombre a todos agregando sus correspondientes valores de desplazamiento inicial y final, como este: "[63209875968-70209875967] f123456789.mkv" (para un tamaño de archivo de 7000000000 bytes en este ejemplo). Probé este script por lotes:

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"
)

Pero no funciona, aunque los comandos individuales sí funcionan dentro de CMD; las variables no se expanden correctamente. Probé con "setlocal enableelayedexpansion" y !variable! en lugar de %variable%, sin éxito. Además, leí que los cálculos en CMD estaban limitados a una precisión de 32 bits, por lo que si lo hago bien, usando el comando por lotes set /a solo podría calcular compensaciones hasta 4294967296 de todos modos (incluso para el primer archivo eso no es suficiente) . Lo que significa que debería usar otro lenguaje de programación, pero ¿cuál sería apropiado y cómo podría encontrar rápidamente el comando correspondiente para hacer lo que quiero hacer? Pasé la mayor parte de la tarde tratando de obtener los conceptos básicos de PowerShell y adaptar el script anterior, pero hasta ahora solo pude imprimir los nombres de los archivos y eliminar el primer carácter... (Es bastante frustrante, considerando que con la misma cantidad de Esta vez podría haber hecho esta tarea manualmente y es posible que ya esté terminada. Sin embargo, es más propenso a errores, otra razón por la que me gustaría automatizarla...) ¡Solo necesito:

  • establecer una variable con el primer número de sector, obtenido del nombre del archivo,
  • establezca una variable para el primer valor de compensación, que es el número de sector multiplicado por 512,
  • establezca una variable para el último valor de desplazamiento, que es el primer desplazamiento más el tamaño del archivo menos 1,
  • cambie el nombre de los archivos usando el patrón antes mencionado.

Alguna idea ? Gracias !


actualización 1

Entonces, después de otra noche de jugar torpemente con Powershell, creo que hice algunas cosas bien. Los primeros pasos parecen funcionar bien, pero obtengo un error indescifrable tras otro cuando se trata de cambiar el nombre de los archivos. ¿Qué hay de malo con el siguiente comando Cambiar nombre de elemento? ¿Y hay formas de hacer esto de manera más simple y 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}
}

actualización 2

Resolví esto corrigiendo la última línea así:

Rename-Item $file -NewName ( "[$offset1-$offset2] " + $file.name )

Respuesta1

El ForEachbucle que publicaste parece correcto porque logra tus objetivos, todos menos la Rename-Itemlínea. Debería ser:

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

Para encontrar más información sobre un cmdlet y su sintaxis, use Get-Help Remove-Item -full. Encontrará detalles ampliados junto con ejemplos útiles.

información relacionada