Как разрешить пути, завершенные тильдой, в Windows Cmd/Powershell

Как разрешить пути, завершенные тильдой, в Windows Cmd/Powershell

Я пытаюсь автоматизировать удаление некоторых приложений, одно из которых — 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. Как называется этот механизм? Я пока называю его «тильда-дополнение», но, возможно, есть и другое название.
  2. Как мне преобразовать этот путь, завершенный тильдой, в обычный?

решение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

Связанный контент