Я восстановил около 300 MKV файлов с жесткого диска 4 ТБ, используя Photorec. Эти файлы названы в соответствии с их первым сектором, например "f123456789.mkv". Теперь я хочу переименовать их, добавив соответствующие начальные и конечные значения смещения, например: «[63209875968-70209875967] f123456789.mkv» (для размера файла 7000000000 байт в этом примере). Я попробовал этот пакетный скрипт:

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

Но это не работает, хотя отдельные команды работают в CMD; переменные не раскрываются правильно. Я попытался с "setlocal enabledelayedexpansion", и!переменная! вместо% variable%, безрезультатно. Кроме того, я прочитал, что вычисления в CMD были ограничены 32-битной точностью, поэтому, если я правильно понял, используя набор командных команд /a, я все равно мог бы рассчитать только смещения до 4294967296 (даже для первого файла этого недостаточно) , Что означает, что я должен использовать другой язык сценариев, но какой из них будет подходящим, и как я могу быстро найти соответствующую команду, чтобы сделать то, что я хочу сделать? Я провел большую часть дня, пытаясь понять основы PowerShell и адаптировать вышеупомянутый скрипт, но до сих пор мне удавалось только напечатать имена файлов и удалить первый символ ... (Это довольно печально, учитывая, что с таким же количеством времени я мог бы выполнить эту задачу вручную, и она может быть завершена к настоящему моменту! Это более подвержено ошибкам, еще одна причина, почему я хотел бы автоматизировать это ...) Мне просто нужно:

  • установить переменную с первым номером сектора, полученным из имени файла,
  • установить переменную для первого значения смещения, которое является номером сектора, умноженным на 512,
  • установить переменную для последнего значения смещения, которое является первым смещением плюс размер файла минус 1,
  • переименуйте файлы, используя вышеупомянутый шаблон.

Любая идея ? Спасибо !


обновление 1

Итак, после очередной ночи неуклюжего возни с Powershell, я думаю, что я понял несколько вещей правильно. Первые шаги, кажется, работают нормально, но я получаю неразборчивую ошибку после неразборчивой ошибки, когда дело доходит до фактического переименования файлов. Что не так с командой Rename-Item ниже? И есть ли способы сделать это более просто / элегантно?

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}
}

обновление 2

Я решил это, исправив последнюю строку следующим образом:

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

1 ответ1

0

Цикл ForEach вы опубликовали, выглядит правильным в том смысле, что он достигает ваших целей, кроме строки Rename-Item . Так должно быть:

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

Чтобы узнать больше информации о командлете и его синтаксисе, используйте Get-Help Remove-Item -full . Вы найдете расширенные детали вместе с полезными примерами.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .