обновление 1

обновление 1

Я восстановил около 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 enabledelayeexpansion" и !variable! вместо %variable%, но безрезультатно. Кроме того, я читал, что вычисления в CMD ограничены 32-битной точностью, поэтому, если я правильно понял, с помощью пакетной команды set /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

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

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

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

Связанный контент