更新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 中確實有效;變數未正確擴展。我嘗試使用“setlocalenabledelayedexpansion”,並且!而不是 %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

您發布的循環ForEach看起來是正確的,因為它實現了您的目標,除了線路之外Rename-Item。它應該是:

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

要查找有關 cmdlet 及其語法的更多信息,請使用Get-Help Remove-Item -full.您將找到更多詳細資訊以及有用的範例。

相關內容