Я пытаюсь автоматизировать удаление некоторых приложений, одно из которых — XtremeTuner. XtremeTuner сохраняет команду, используемую для его удаления, в реестре в HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\XtremeTuner
разделе. На моем компьютере раздел имеет следующее значение:
C:\PROGRA~2\XTREME~1\XTREME~1\UNWISE.EXE C:\PROGRA~2\XTREME~1\XTREME~1\INSTALL.LOG
Сначала я думал, что это неправильно, но путь на самом деле работает. Оказывается, символ тильды, за которым следует число, выполняет что-то вроде расширения табуляции. Немного подвержено ошибкам, но ладно. Например:
C:\Program~1
решаетC:\Program Files
C:\Program~2
решаетC:\Program Files (x86)
C:\Program~3
решаетC:\ProgramData
Powershell, похоже, знает об этом, но не все программное обеспечение знает (например, Chocolatey проверяет путь и приходит к выводу, что он неверный).
Мои вопросы:
- Как называется этот механизм? Я пока называю его «тильда-дополнение», но, возможно, есть и другое название.
- Как мне преобразовать этот путь, завершенный тильдой, в обычный?
решение1
Как называется этот механизм?
Это те самые "8.3 имена" создан для совместимости с 16-разрядным программным обеспечением MS-DOS и Windows 3.x, в котором имена файлов были ограничены именно этим размером.
(API-интерфейсы доступа к файлам в этих операционных системах имеют встроенное предположение о фиксированной длине, поэтому старые программы, написанные для Win16 или DOS, постоянно подвержены ограничению, даже если вы запускаете их в более поздней версии Windows. Поэтому Windows предоставляет короткие псевдонимы для длинных имен, чтобы пользователи могли по-прежнему запускать свои старые программы на своих новых компьютерах с Windows 95.)
Возможно, вы видите этот путь, потому что старые версии системы установки WISE на самом деле генерировали 32-разрядные установщики с 16-разрядным модулем запуска (что должно было отображать понятное сообщение об ошибке в Windows 3.x вместо стандартного сообщения «недопустимый файл .exe»).
Оказывается, символ тильды, за которым следует число, выполняет что-то вроде расширения табуляции. Немного подвержено ошибкам, но ладно.
Нет, тильда на самом деле нерасширенныйвообще. Вместо этого, тот же файл или папкабуквально имеет оба имениему назначено, а тильда просто является фактической частью имен 8.3, которые генерирует Windows. (Известно, что некоторые операционные системы, работающие с дисками в формате FAT, генерируют имена 8.3без(тильда.)
Таким образом, расширение выполняется не пространством пользователя, а самой файловой системой — драйвер FAT или NTFS распознает одну и ту же папку как одновременно названную Program Files
и PROGRA~1
. Здесь нет необходимости в догадках — имя 8.3 назначается статически, всякий раз, когда элемент создается или переименовывается (текущие имена 8.3 можно увидеть, используя dir /x
в командной строке), и PROGRA~3 всегда останется PROGRA~3, даже если PROGRA~2 удалена.
Это также означает, что везде, где используется путь к файлу,обаполное имя и короткое имя 8.3 должны быть приняты одинаково, несмотря на то, что последнее скрыто от списков каталогов. Программы, которые не принимают имя 8.3, обычно делают что-то неправильно.
(Обратите внимание, что генерацию имен 8.3 на дисках NTFS можно отключить, поэтому dir /x
команда может показывать отсутствие некоторых имен. Однако отключение генерации 8.3 не делает недействительными ранее назначенные имена.)
Как мне преобразовать этот путь, завершенный тильдой, в обычный?
Через Win32 API вы можете вызыватьGetLongPathName()илиПолучитьПолноеИмяПути().
С помощью PowerShell вы можете получить доступ (Get-Item).FullName
к (Get-ChildItem).FullName
:
PS C:\Users\Foo> (get-item -force "c:\users\foo\virtua~1").Name
.VirtualBox
PS C:\Users\Foo> (get-item -force "c:\users\foo\virtua~1").FullName
C:\Users\Foo\.VirtualBox
PS C:\Users\Foo> get-item -force docume~1,micros~1,virtua~1 | ft Name,FullName
Name FullName
---- --------
Documents C:\Users\Foo\Documents
MicrosoftEdgeBackups C:\Users\Foo\MicrosoftEdgeBackups
.VirtualBox C:\Users\Foo\.VirtualBox