【问题标题】:Easy way to automatically generate short file name自动生成短文件名的简单方法
【发布时间】:2021-04-07 04:31:21
【问题描述】:

我有一台非常旧的车载收音机,可以播放格式化为 FAT16 或 FAT32 的 USB 闪存驱动器中的音乐,但它按 8.3 短文件名而不是长文件名对文件进行排序。 我想播放分成多个文件的有声读物,但 Windows 有时会生成 f***ed 8.3 文件名。 以下是包含 Internet1.mp3 到 Internet7.mp3 的文件夹的 dir /x 的输出示例:

                                  Short          Long
30.12.2020  15:59  2.186.859   INTERN~1.MP3   Internet1.mp3
30.12.2020  15:59  2.507.643   INTERN~2.MP3   Internet2.mp3
30.12.2020  15:59  2.423.319   INTERN~3.MP3   Internet3.mp3
30.12.2020  15:59  2.110.163   INTERN~4.MP3   Internet4.mp3
30.12.2020  15:59  2.007.345   IN1FAB~1.MP3   Internet5.mp3
30.12.2020  15:59  2.921.422   IN64EF~1.MP3   Internet6.mp3
30.12.2020  15:59  3.290.689   INB914~1.MP3   Internet7.mp3

如您所见,文件 Internet5.mp3 到 Internet7.mp3 将在 Internet1.mp3 到 Internet4.mp3 之前播放,因为它们具有随机的短文件名。我的一些有声读物分为 100 多个部分,所以我想要一个脚本(Batch、Powershell、Python 等),它可以自动将短文件名设置为可用的东西,即INT1.MP3 到 INT7.MP3 播放哪个文件夹没有问题。长文件名包含一个升序数字(此处为 1 到 7),它给出了文件的正确顺序。

【问题讨论】:

  • 你怎么知道文件的放置顺序?这也是一个“为我编写一个执行 x 的脚本”类型的问题,并且可能会被关闭。请修改以寻求有关更改现有代码的具体帮助。
  • 只需将文件重命名为 8 个字符或更短的任何名称 :)
  • 您无法生成自己的短名称。这是由操作系统完成的。你可以做的是用缩短的标准名称重命名你的文件。
  • 您确定它是按 8.3 名称排序的吗?大多数(旧)MP3 播放器使用 FAT 中的顺序,因为它们没有足够的资源进行排序。见How to reorder the files of a FAT32 file system?
  • @Lee_Dailey 这不是真的。您可以通过运行 fsutil file setShortName 设置自己的 8.3 名称

标签: powershell filenames fat32 fat short-filenames


【解决方案1】:

您可以使用它来将所有匹配Internet* 模式的文件更改为INTxxxxx

$i = 0
foreach ($f in ls Internet*) {
    fsutil file setShortName $f ("INT" + $i.ToString("D5") + ".MP3")
    $i++
}

您可以将ls Internet* 更改为仅ls 以忽略前缀并重命名文件夹中的所有文件

$i = 0; foreach ($f in ls *.mp3) { fsutil file setShortName $f ($i.ToString("D8") + ".MP3"); $i++ }

更新:

不幸的是,您可以为 NTFS 分区上的文件设置短名称,因为这是 SetFileShortName() Win32 API 的限制

设置指定文件的短名称。该文件必须位于 NTFS 文件系统卷上。

因此,您可以对 FAT16/32 分区执行的唯一方法是将所有文件重命名为像这样的短 8.3 名称

$i = 0; foreach ($f in ls *.mp3) { mv $f ($i.ToString("D8") + ".MP3"); $i++ }

当然你也可以像上面那样使用INTxxxxx.MP3格式

您可以manually hex edit the partition 设置短名称并重新计算校验和,但它会很脆弱,除非有人编写一个工具来自动化所有这些事情


请注意,IN1FAB~1.MP3IN64EF~1.MP3 之类的名称不是随机的。它们是文件名的哈希值,因为很明显File~NUMBER 模式在文件夹中有超过 9 个具有该前缀的文件时不起作用,因此必须使用更强大的东西

  1. 在包括 Windows 2000 和更高版本在内的所有 NT 版本上,如果至少有 4 个文件或文件夹具有相同的扩展名和短名称中的前 6 个字符,则剥离的 LFN 会被截断为基本名称的前 2 个字母 (或 1 如果基本名称只有 1 个字母),后跟 4 个从文件名的未记录哈希派生的十六进制数字,后跟波浪号,后跟单个数字,后跟句点 .,后跟前 3 个字符扩展名。

    • 示例:TextFile.Mine.txt 变为 TE021F~1.TXT

https://en.wikipedia.org/wiki/8.3_filename#VFAT_and_computer-generated_8.3_filenames

【讨论】:

  • 非常感谢!该脚本适用于我的 NTFS 硬盘驱动器,但不适用于 FAT32 闪存驱动器。当我将重命名的文件从硬盘复制到闪存驱动器时,它们会获得与以前相同的 8.3 名称(即 IN1FAB~1.MP3)。尝试运行您在闪存驱动器上发布的脚本只会给出 fsutil 仅适用于 NTFS 卷的错误。
  • 是的,我知道某些 fsutil 命令不适用于 FAT32,但我认为 file setshortname 不属于这一类。我正在尝试查看如何在 FAT32 中执行此操作。无论如何,在这种情况下,它将是 How to set FAT32 short names in Powershell or Windows Command Shell 的副本
  • @Adamantium23 看到我的编辑。 SetFileShortName 仅适用于 NTFS,因此您必须将文件重命名为短名称
  • 我做了,所以将所有文件名设置为 8.3 模式。它现在可以工作了,因为它只适用于汽车音响中的有声读物,我会接受这个解决方案!谢谢您的帮助!我已经看到了你链接的胎面 - 它仍然没有答案......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 2011-05-12
  • 2013-03-19
相关资源
最近更新 更多