如何在 Windows Cmd/Powershell 中解析波形符號完成的路徑

如何在 Windows Cmd/Powershell 中解析波形符號完成的路徑

我正在嘗試自動卸載一些應用程序,其中之一是 XtremeTuner。 XtremeTuner 將用於卸載它的命令保存在註冊表中的HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\XtremeTunerkey 下。該密鑰在我的機器上具有以下值:

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 安裝系統實際上使用 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

相關內容