So lösen Sie mit Tilde vervollständigte Pfade in Windows Cmd/Powershell auf

So lösen Sie mit Tilde vervollständigte Pfade in Windows Cmd/Powershell auf

Ich versuche, die Deinstallation einiger Anwendungen zu automatisieren, eine davon ist XtremeTuner. XtremeTuner speichert einen Befehl zur Deinstallation in der Registrierung unter HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\XtremeTunerdem Schlüssel. Der Schlüssel hat auf meinem Computer den folgenden Wert:

C:\PROGRA~2\XTREME~1\XTREME~1\UNWISE.EXE C:\PROGRA~2\XTREME~1\XTREME~1\INSTALL.LOG

Zuerst dachte ich, das sei falsch, aber der Pfad funktioniert tatsächlich. Es stellte sich heraus, dass ein Tilde-Zeichen, gefolgt von einer Zahl, so etwas wie eine Tabulatorerweiterung bewirkt. Etwas fehleranfällig, aber ok. Also zum Beispiel:

  • C:\Program~1beschließt,C:\Program Files
  • C:\Program~2beschließt,C:\Program Files (x86)
  • C:\Program~3beschließt,C:\ProgramData

Powershell scheint sich dessen bewusst zu sein, aber nicht alle Software tut dies (beispielsweise validiert Chocolatey den Pfad und kommt zu dem Schluss, dass er falsch ist).

Meine Fragen:

  1. Wie heißt dieser Mechanismus? Ich nenne ihn vorerst „Tilde-Vervollständigung“, aber es gibt wahrscheinlich noch einen anderen Namen dafür.
  2. Wie löse ich diesen mit Tilde vervollständigten Pfad in einen normalen Pfad auf?

Antwort1

Wie nennt man diesen Mechanismus?

Das sind die „8.3 Namen" wurde aus Kompatibilitätsgründen mit 16-Bit-MS-DOS- und Windows 3.x-Software generiert, bei der die Dateinamen auf genau diese Größe beschränkt waren.

(Die Dateizugriffs-APIs dieser Betriebssysteme haben diese Annahme einer festen Länge eingebaut, sodass alte, für Win16 oder DOS geschriebene Programme dauerhaft von der Beschränkung betroffen sind, selbst wenn Sie sie auf einer späteren Windows-Version ausführen. Daher stellt Windows kurze Aliase für lange Namen bereit, damit Benutzer ihre alten Programme auch auf ihren brandneuen Windows 95-Rechnern ausführen können.)

Dieser Pfad wird Ihnen möglicherweise deshalb angezeigt, weil ältere Versionen des WISE-Installationssystems tatsächlich 32-Bit-Installationsprogramme mit einem 16-Bit-Launcher generiert haben (der unter Windows 3.x eine freundliche Fehlermeldung anzeigen sollte, statt einer allgemeinen Meldung „ungültige EXE-Datei“).

Es stellt sich heraus, dass ein Tilde-Zeichen, gefolgt von einer Zahl, so etwas wie eine Tabulatorerweiterung bewirkt. Etwas fehleranfällig, aber ok.

Nein, die Tilde ist eigentlich nichterweitertüberhaupt. Stattdessen dieselbe Datei oder derselbe Ordnerhat buchstäblich beide Namenzugewiesen, und die Tilde ist zufällig ein tatsächlicher Teil der 8.3-Namen, die Windows generiert. (Einige Betriebssysteme, die mit FAT-formatierten Festplatten arbeiten, generieren 8.3-Namenohneeine Tilde.)

Die Erweiterung wird also nicht vom Benutzerbereich, sondern vom Dateisystem selbst vorgenommen. Der FAT- oder NTFS-Treiber erkennt denselben Ordner als gleichzeitig benannt Program Filesund PROGRA~1. Es muss nicht geraten werden – der 8.3-Name wird statisch zugewiesen, wenn das Element erstellt oder umbenannt wird (aktuelle 8.3-Namen können Sie dir /xin der Eingabeaufforderung sehen), und PROGRA~3 bleibt immer PROGRA~3, selbst wenn PROGRA~2 gelöscht wird.

Dies bedeutet auch, dass überall, wo ein Dateipfad verwendet wird,beideder vollständige Name und der kurze 8.3-Name sollten gleichermaßen akzeptiert werden, auch wenn letzterer in Verzeichnislisten ausgeblendet ist. Programme, die einen 8.3-Namen nicht akzeptieren, machen normalerweise etwas falsch.

(Beachten Sie, dass die Generierung von 8.3-Namen auf NTFS-Datenträgern deaktiviert werden kann, sodass der dir /xBefehl möglicherweise einige fehlende Namen anzeigt. Durch das Deaktivieren der 8.3-Generierung werden zuvor zugewiesene Namen jedoch nicht ungültig.)

Wie löse ich diesen mit Tilde vervollständigten Pfad in einen normalen Pfad auf?

Über die Win32-API können Sie aufrufenGetLongPathName()oderGetFullPathName().

Über PowerShell können Sie (Get-Item).FullNameauf Folgendes zugreifen (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

verwandte Informationen