Пакетное переименование файлов, восстановленных Photorec, со значениями смещения

я восстановил около 300 MKV файлов с 4TB HDD, используя 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-битной точностью, поэтому, если я правильно понял, используя пакетную команду set /a, я мог вычислять смещения только до 4294967296 в любом случае (даже для первого файла этого недостаточно). Это означает, что я должен использовать другой язык сценариев, но какой из них будет подходящим, и как я могу быстро найти соответствующая команда, чтобы сделать то, что я хочу сделать ? Я провел большую часть дня, пытаясь понять основы PowerShell и адаптировать приведенный выше сценарий, но до сих пор я мог печатать только имена файлов и удалять первый символ... (Это довольно неприятно, учитывая, что с тем же количеством времени я мог бы сделать эту задачу вручную, и это может быть закончено к настоящему времени ! Однако он более подвержен ошибкам, еще одна причина, по которой я хотел бы его автоматизировать...) Мне просто нужно:

  • установить a переменная с первым номером сектора, полученная из имени файла,
  • задайте переменную для первого значения смещения, которое является номером сектора, умноженным на 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 )
24
задан GabrielB
28.01.2023 2:17 Количество просмотров материала 3021
Распечатать страницу

1 ответ

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

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

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

0
отвечен root 2023-01-29 10:05

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя

Похожие вопросы про тегам:

batch
command-line
powershell
vbscript
windows
Вверх