![如何在 Windows Cmd/Powershell 中解析波形符號完成的路徑](https://rvso.com/image/1654784/%E5%A6%82%E4%BD%95%E5%9C%A8%20Windows%20Cmd%2FPowershell%20%E4%B8%AD%E8%A7%A3%E6%9E%90%E6%B3%A2%E5%BD%A2%E7%AC%A6%E8%99%9F%E5%AE%8C%E6%88%90%E7%9A%84%E8%B7%AF%E5%BE%91.png)
我正在嘗試自動卸載一些應用程序,其中之一是 XtremeTuner。 XtremeTuner 將用於卸載它的命令保存在註冊表中的HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\XtremeTuner
key 下。該密鑰在我的機器上具有以下值:
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 安裝系統實際上使用 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