更新 1

更新 1

我使用 Photorec 从 4TB 硬盘恢复了大约 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 的基础知识并修改上述脚本,但到目前为止,我只能打印文件名并删除第一个字符...(这很令人沮丧,因为考虑到用同样的时间我本可以手动完成这项任务,现在可能已经完成了!但它更容易出错,这也是我想自动化的另一个原因...)我只需要:

  • 设置一个变量,其中包含从文件名中获取的第一个扇区号,
  • 设置一个变量用于第一个偏移值,即扇区号乘以 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。您将找到扩展的详细信息以及有用的示例。

相关内容