Aktualisierung 1

Aktualisierung 1

Ich habe mithilfe von Photorec etwa 300 MKV-Dateien von einer 4-TB-Festplatte wiederhergestellt. Diese Dateien sind nach ihrem ersten Sektor benannt, z. B. „f123456789.mkv“. Nun möchte ich sie alle umbenennen, indem ich ihre entsprechenden Anfangs- und Endoffsetwerte hinzufüge, wie folgt: „[63209875968-70209875967] f123456789.mkv“ (für eine Dateigröße von 7000000000 Bytes in diesem Beispiel). Ich habe dieses Batch-Skript ausprobiert:

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

Aber es funktioniert nicht, obwohl die einzelnen Befehle innerhalb von CMD funktionieren; die Variablen werden nicht richtig expandiert. Ich habe es mit "setlocal enabledelayedexpansion" und !variable! statt %variable% versucht, aber ohne Erfolg. Außerdem habe ich gelesen, dass die Berechnungen in CMD auf eine Genauigkeit von 32 Bit beschränkt sind, sodass ich, wenn ich es richtig mache, mit dem Batch-Befehl set /a sowieso nur Offsets bis 4294967296 berechnen könnte (selbst für die erste Datei ist das nicht genug). Das heißt, ich sollte eine andere Skriptsprache verwenden, aber welche wäre geeignet und wie könnte ich schnell den entsprechenden Befehl finden, um das zu tun, was ich tun möchte? Ich habe den Großteil des Nachmittags damit verbracht, mir die Grundlagen von PowerShell anzueignen und das obige Skript anzupassen, konnte bisher aber nur die Dateinamen drucken und das erste Zeichen entfernen ... (Das ist ziemlich frustrierend, wenn man bedenkt, dass ich diese Aufgabe in der gleichen Zeit auch manuell hätte erledigen können und inzwischen vielleicht schon erledigt wäre! Allerdings ist sie fehleranfälliger, ein weiterer Grund, warum ich sie gerne automatisieren würde ...) Ich muss nur Folgendes tun:

  • Setzen Sie eine Variable mit der ersten Sektornummer, die aus dem Dateinamen abgeleitet wird.
  • Setzen Sie eine Variable für den ersten Offset-Wert, also die Sektornummer multipliziert mit 512,
  • Setzen Sie eine Variable für den letzten Offsetwert, der sich aus dem ersten Offset plus der Dateigröße minus 1 ergibt.
  • Benennen Sie die Dateien nach dem oben genannten Muster um.

Irgendeine Idee? Danke!


Aktualisierung 1

Nach einer weiteren Nacht des unbeholfenen Herumprobierens mit Powershell glaube ich, dass ich ein paar Dinge richtig gemacht habe. Die ersten Schritte scheinen gut zu funktionieren, aber wenn ich die Dateien tatsächlich umbenennen will, bekomme ich einen unverständlichen Fehler nach dem anderen. Was ist falsch an dem Befehl „Rename-Item“ unten? Und gibt es Möglichkeiten, dies einfacher/eleganter zu machen?

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

Aktualisierung 2

Ich habe dies gelöst, indem ich die letzte Zeile wie folgt korrigiert habe:

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

Antwort1

Die ForEachvon Ihnen gepostete Schleife sieht insofern korrekt aus, als dass sie Ihre Ziele erreicht, bis auf die Rename-ItemZeile. Sie sollte lauten:

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

Um weitere Informationen zu einem Cmdlet und seiner Syntax zu erhalten, verwenden Sie Get-Help Remove-Item -full. Sie finden ausführlichere Details sowie hilfreiche Beispiele.

verwandte Informationen