如何解决 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. 这种机制叫什么名字?我暂时叫它“tilde-completion”,但可能还有其他名字。
  2. 我如何将这个波浪号完成的路径解析为正常路径?

答案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 FilesPROGRA~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

相关内容