Cómo resolver rutas completadas con tilde en Windows Cmd/Powershell

Cómo resolver rutas completadas con tilde en Windows Cmd/Powershell

Estoy intentando automatizar la desinstalación de algunas aplicaciones, una de las cuales es XtremeTuner. XtremeTuner guarda un comando utilizado para desinstalarlo en el registro bajo HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\XtremeTunerclave. La clave tiene el siguiente valor en mi máquina:

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

Al principio pensé que eso era incorrecto, pero la ruta realmente funciona. Resulta que un carácter de tilde seguido de un número realiza algo así como una expansión de pestaña. Un poco propenso a errores, pero está bien. Así por ejemplo:

  • C:\Program~1resuelveC:\Program Files
  • C:\Program~2resuelveC:\Program Files (x86)
  • C:\Program~3resuelveC:\ProgramData

Powershell parece ser consciente de ello, pero no todo el software lo sabe (por ejemplo, Chocolatey valida la ruta y concluye que es incorrecta).

Mis preguntas:

  1. ¿Cómo se llama este mecanismo? Por ahora lo llamo "completar con tilde", pero probablemente haya otro nombre para ello.
  2. ¿Cómo resuelvo esta ruta completa con tilde a una normal?

Respuesta1

¿Cómo se llama este mecanismo?

Esos son los "8.3 nombres" generado para compatibilidad con software MS-DOS de 16 bits y Windows 3.x, en el que los nombres de archivos estaban limitados exactamente a este tamaño.

(Las API de acceso a archivos en esos sistemas operativos tienen esta suposición de longitud fija incorporada, por lo que los programas antiguos escritos para Win16 o DOS se ven afectados permanentemente por el límite incluso si los ejecuta en una versión posterior de Windows. Por lo tanto, Windows proporciona alias cortos para nombres largos para que la gente todavía pudiera ejecutar sus programas antiguos en sus nuevas máquinas con Windows 95).

Podría ser que estés viendo esta ruta porque las versiones anteriores del sistema de instalación WISE en realidad generaban instaladores de 32 bits con un iniciador de 16 bits (destinado a mostrar un mensaje de error amigable en Windows 3.x, en lugar de un archivo genérico "no válido". archivo ejecutable").

Resulta que un carácter de tilde seguido de un número realiza algo así como una expansión de pestaña. Un poco propenso a errores, pero está bien.

No, la tilde en realidad no esexpandidoen absoluto. En cambio, el mismo archivo o carpetaliteralmente tiene ambos nombresasignado a él, y la tilde resulta ser una parte real de los nombres 8.3 que genera Windows. (Se sabe que algunos sistemas operativos que trabajan con discos formateados FAT generan nombres 8.3sinuna tilde.)

Por lo tanto, la expansión no la realiza el espacio de usuario sino el propio sistema de archivos: el controlador FAT o NTFS reconoce que la misma carpeta tiene simultáneamente el nombre Program Filesy PROGRA~1. No hay que adivinar: el nombre 8.3 se asigna estáticamente, cada vez que se crea o cambia el nombre del elemento (puede ver los nombres actuales 8.3 dir /xen el símbolo del sistema), y PROGRA~3 siempre seguirá siendo PROGRA~3 incluso si se elimina PROGRA~2. .

Esto también significa que en cualquier lugar donde se utilice una ruta de archivo,ambosel nombre completo y el nombre corto 8.3 deben aceptarse igual, a pesar de que este último esté oculto en los listados del directorio. Los programas que no aceptan el nombre 8.3 normalmente hacen algo mal.

(Tenga en cuenta que la generación de nombres 8.3 en discos NTFS se puede deshabilitar, por lo que el dir /xcomando puede mostrar que faltan algunos nombres. Sin embargo, deshabilitar la generación 8.3 no invalida los nombres asignados previamente).

¿Cómo resuelvo esta ruta completa con tilde a una normal?

A través de la API de Win32, puede llamarObtener nombre de ruta larga()oObtener nombre de ruta completa().

A través de PowerShell, puede acceder (Get-Item).FullNamea o (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

información relacionada