
我使用 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
.您將找到更多詳細資訊以及有用的範例。