Простой способ автоматически сгенерировать короткое имя файла

У меня есть очень старый автомобильный радиоприемник, который может воспроизводить музыку с USB-накопителей, отформатированных в FAT16 или FAT32, но он сортирует файлы по короткому имени файла 8.3, а не по длинному имени файла. Я хочу проигрывать аудиокниги, разделенные на несколько файлов, но Windows иногда генерирует испорченные имена файлов 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 частей, поэтому я хотел бы иметь скрипт (пакетный, Powershell, Python и т. д.), который автоматически устанавливает короткое имя файла на что-то пригодное для использования, т.е. От INT1.MP3 до INT7.MP3 Нет проблем с выбором папки для воспроизведения. Длинные имена файлов содержат восходящие числа (здесь от 1 до 7), что указывает на правильный порядок файлов.


person Adamantium23    schedule 30.12.2020    source источник
comment
Как узнать, в каком порядке класть файлы? Это также вопрос типа «напишите для меня скрипт, который делает x», и, скорее всего, он будет закрыт. Пересмотрите, чтобы запросить конкретную помощь с изменением ранее существовавшего кода.   -  person FoxDeploy    schedule 30.12.2020
comment
Просто переименуйте файлы в любое имя длиной 8 символов или короче :)   -  person Mathias R. Jessen    schedule 30.12.2020
comment
вы не можете генерировать свои собственные короткие имена. это делает ОС. то, что вы МОЖЕТЕ сделать, это переименовать ваши файлы с сокращенными стандартными именами.   -  person Lee_Dailey    schedule 30.12.2020
comment
вы уверены, что он отсортирован по имени 8.3? Большинство (старых) MP3-плееров используют порядок в FAT, потому что им не хватает ресурсов для сортировки. См. Как изменить порядок файлов в файловой системе FAT32?   -  person phuclv    schedule 30.12.2020
comment
@Lee_Dailey, это неправда. Вы можете установить собственное имя версии 8.3, запустив fsutil file setShortName   -  person phuclv    schedule 30.12.2020
comment
@phuclv Да, так как я уже пытался изменить порядок в FAT. Иглы, чтобы сказать, что это не сработало.   -  person Adamantium23    schedule 30.12.2020
comment
@phuclv - ооо! я кое-что узнал ... спасибо! [усмехнуться]   -  person Lee_Dailey    schedule 30.12.2020


Ответы (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, как указано выше.

Вы можете вручную отредактировать раздел в шестнадцатеричном формате, чтобы установить короткие имена и пересчитать контрольные суммы, но это будет хрупким, если кто-то не напишет инструмент для автоматизации всех этих вещей


Обратите внимание, что такие имена, как IN1FAB~1.MP3 или IN64EF~1.MP3, не случайны. Это хэш имен файлов, потому что очевидно, что шаблон File~NUMBER не работает, если в папке более 9 файлов с таким префиксом, поэтому необходимо использовать что-то более надежное.

  1. Во всех версиях NT, включая Windows 2000 и более поздние версии, если по крайней мере 4 файла или папки уже существуют с тем же расширением и первыми 6 символами в их кратких именах, сокращенный LFN вместо этого усекается до первых 2 букв базового имени (или 1, если базовое имя состоит только из 1 буквы), за которыми следуют 4 шестнадцатеричных цифры, полученные из недокументированного хэша имени файла, за которыми следует тильда, за которой следует одна цифра, за которой следует точка ., за которой следуют первые 3 символа расширения.

    • Example: TextFile.Mine.txt becomes TE021F~1.TXT.

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

person phuclv    schedule 30.12.2020
comment
Большое спасибо! Этот скрипт работал на моем NTFS-жестком диске, но не на FAT32-Flash. Когда я копирую переименованные файлы с жесткого диска на флешку, они получают те же имена 8.3, что и раньше (например, IN1FAB~1.MP3). Попытка запустить скрипт, который вы разместили на флешке, дает только ошибку, что fsutil работает только с томами NTFS. - person Adamantium23; 30.12.2020
comment
Да, я знал, что некоторые команды fsutil плохо работают с FAT32, но я не думал, что file setshortname подпадает под эту категорию. Я пытаюсь посмотреть, как это сделать в FAT32. В любом случае в этом случае это будет дубликат Как установить короткие имена FAT32 в Powershell или командной оболочке Windows - person phuclv; 31.12.2020
comment
@Adamantium23 см. мою правку. SetFileShortName работает только в NTFS, поэтому вы должны переименовать файл в короткое имя - person phuclv; 31.12.2020
comment
Я так и сделал, исправил все имена файлов по шаблону 8.3. Теперь это работает, и поскольку это только для аудиокниг в автомобильной стереосистеме, я буду жить с решением! Спасибо за помощь! Я уже видел ссылку, которую вы связали, - она ​​все еще без ответа... - person Adamantium23; 31.12.2020