Convierta el nombre de archivo largo en nombre de archivo corto (8.3) con cmd.exe

Estoy tratando de convertir un nombre de archivo largo a un nombre de archivo corto (8.3) en Windows.

Un archivo de proceso por lotes con un argumento de línea de comando funciona según lo previsto:

short.bat :

@echo OFF echo %~s1 

invocando short.bat C:\Documents and Settings\User\NTUSER.DAT devuelve C:\DOCUM~1\USER\NTUSER.DAT

Sin embargo, no me gusta tener un archivo .bat adicional para esto. Prefiero llamar a cmd.exe con todo el comando de un script de ruby. ¿Cómo puedo hacer esto?

Como un paso intermedio intenté hardcode la ruta en el archivo por lotes, pero eso no funciona:

short1.bat :

 @echo OFF SET filename="C:\Documents and Settings\User\NTUSER.DAT" echo %filename% echo %~sfilename% 

echo %filename% funciona, pero echo %~sfilename% da el siguiente error:

 The following usage of the path operator in batch-parameter substitution is invalid: %~sfilename% For valid formats type CALL /? or FOR /? 

Si short1.bat funciona, ¿cómo puedo convertir esto en un trazador de líneas que se puede llamar con cmd.exe \c ... ?

Hay otra pregunta ( cómo obtener la ruta DOS en lugar de la ruta de Windows ), sin embargo, esa es específicamente la ruta de acceso del directorio actual.

 cmd /c for %A in ("C:\Documents and Settings\User\NTUSER.DAT") do @echo %~sA 

Reemplace el nombre de archivo.txt por el nombre de archivo que desea convertir a 8.3

 dir /x filename.txt 

Luego tendrá que dividir el resultado con espacios en blanco como su delimitador (\ s en expresiones regulares). Entonces el valor con el ~ es su nombre de archivo corto. Si su nombre de archivo es corto para comenzar, entonces no encontrará una cadena que contenga un ~.