アップデート 1

アップデート 1

Photorec を使用して、4TB HDD から約 300 個の MKV ファイルを復元しました。これらのファイルは、最初のセクターに従って名前が付けられています (例: "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% の代わりに !variable! を試しましたが、効果はありませんでした。また、CMD での計算は 32 ビットの精度に制限されていると読んだので、正しく理解したとしても、バッチ コマンド set /a を使用しても、4294967296 までのオフセットしか計算できません (最初のファイルでも十分ではありません)。つまり、別のスクリプト言語を使用する必要がありますが、どの言語が適切でしょうか。また、目的の処理を行うための対応するコマンドをすばやく見つけるにはどうすればよいでしょうか。午後の大半を PowerShell の基本を習得し、上記のスクリプトを適応させるのに費やしましたが、これまでのところファイル名を印刷して最初の文字を削除することしかできませんでした... (同じ時間でこのタスクを手動で実行でき、今頃は終わっているかもしれないことを考えると、かなりイライラします。ただし、エラーが発生しやすくなります。これも自動化したい理由の 1 つです...) 必要なのは、次のことだけです。

  • ファイル名から取得した最初のセクター番号を変数に設定する。
  • 最初のオフセット値(セクター番号に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。役立つ例とともに、詳細な情報が見つかります。

関連情報