powershell - 自动生成短文件名的简单方法
问题描述
我有一个非常旧的汽车收音机,当它们被格式化为 FAT16 或 FAT32 时,它可以播放来自 USB 闪存驱动器的音乐,但它按短 8.3 文件名而不是长文件名对文件进行排序。我想播放分成多个文件的有声读物,但 Windows 有时会生成 f***ed 8.3 文件名。dir /x
以下是包含 Internet1.mp3 到 Internet7.mp3 的文件夹的输出示例:
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.MP3
或IN64EF~1.MP3
的名称不是随机的。它们是文件名的散列,因为很明显,File~NUMBER
如果文件夹中有超过 9 个具有该前缀的文件,则该模式不起作用,因此必须使用更强大的东西
在包括 Windows 2000 和更高版本在内的所有 NT 版本上,如果至少有 4 个文件或文件夹具有相同的扩展名和短名称中的前 6 个字符,则剥离的 LFN 会被截断为基本名称的前 2 个字母(如果基本名称只有 1 个字母),后跟 4 个从文件名的未记录散列派生的十六进制数字,后跟波浪号,后跟单个数字,后跟句
.
点,后跟扩展名的前 3 个字符。
- 示例:
TextFile.Mine.txt
变成TE021F~1.TXT
.https://en.wikipedia.org/wiki/8.3_filename#VFAT_and_computer-generated_8.3_filenames
推荐阅读
- bash - 下载前让 curl 等待
- skorch - Skorch:帮助为多个输出构建分类器
- spring-boot - OppenId 通过 Spring Security OAuth2 连接配置
- php - Laravel 5 如何仅获取数据库中特定用户的一行最新数据
- sql - 如何为Oracle中的列和固定值的组合赋予唯一约束?
- ruby-on-rails - ActiveRecord::StatementInvalid(PG::UndefinedTable: 错误:缺少表“列表”的 FROM 子句条目)
- angular - 单击表单中的图像是否可以打开以相同表单定义的组合框(ionic4)
- python-3.x - 石头、剪刀、纸游戏都想不出问题
- docker - 无法在 docker logs -f 命令中找到初始 jenkins 密码
- react-native - 调度操作后 Redux 状态未更新