自动生成短文件名的简单方法



我有一个非常旧的车载收音机,当它们在FAT16或FAT32中格式化时,它可以播放USB fash驱动器中的音乐,但它按短8.3文件名而不是长文件名对文件进行排序。我想播放分为多个文件的有声读物,但Windows有时会生成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(,该数字表示文件的正确顺序。

您可以使用它将所有与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格式

您可以手动对分区进行十六进制编辑以设置短名称并重新计算校验和,但除非有人编写一个工具来自动化所有这些,否则它将很脆弱


请注意,像IN1FAB~1.MP3IN64EF~1.MP3这样的名称是而不是随机的。它们是文件名的散列,因为如果文件夹中有9个以上带有该前缀的文件,File~NUMBER模式显然不起作用,因此必须使用更健壮的

  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

相关内容

  • 没有找到相关文章

最新更新