我正在尝试自动卸载一些应用程序,其中一个是 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 验证了路径并得出结论它不正确)。
我的问题:
- 这种机制叫什么名字?我暂时叫它“tilde-completion”,但可能还有其他名字。
- 我如何将这个波浪号完成的路径解析为正常路径?
答案1
这个机制怎么叫呢?
这些都是“8.3 名称“为了与 16 位 MS-DOS 和 Windows 3.x 软件兼容而生成,其中文件名被限制为此大小。
(这些操作系统中的文件访问 API 内置了这种固定长度假设,因此即使在更高版本的 Windows 上运行为 Win16 或 DOS 编写的旧程序,它们也会永久受到限制的影响。因此,Windows 为长名称提供了短别名,以便人们仍然可以在全新的 Windows 95 机器上运行旧程序。)
您看到此路径可能是因为旧版本的 WISE 安装系统实际上使用 16 位启动器生成了 32 位安装程序(旨在在 Windows 3.x 上显示友好的错误消息,而不是通用的“无效的 .exe 文件”)。
事实证明,波浪号后面跟一个数字可以执行类似于制表符扩展的操作。有点容易出错,但没问题。
不,波浪号实际上不是扩展完全没有。相反,同一个文件或文件夹确实有两个名字分配给它的波浪号恰好是 Windows 生成的 8.3 名称的实际组成部分。(某些处理 FAT 格式磁盘的操作系统会生成 8.3 名称没有波浪符号。)
因此扩展不是由用户空间完成的,而是由文件系统本身完成的 – FAT 或 NTFS 驱动程序将同一文件夹识别为同时命名的Program Files
和PROGRA~1
。无需猜测 – 8.3 名称是静态分配的,无论何时创建或重命名项目(您可以dir /x
在命令提示符中查看当前的 8.3 名称),即使 PROGRA~2 被删除,PROGRA~3 也始终保持为 PROGRA~3。
这也意味着在任何使用文件路径的地方,两个都全名和 8.3 短名应该被同样接受,尽管后者在目录列表中被隐藏。不接受 8.3 名称的程序通常是出了问题。
(请注意,可以禁用 NTFS 磁盘上 8.3 名称的生成,因此该dir /x
命令可能会显示一些缺失的名称。但是,禁用 8.3 生成不会使先前分配的名称无效。)
我如何将这个波浪号完成的路径解析为正常路径?
通过 Win32 API,您可以调用获取长路径名()或者获取完整路径名()。
通过 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