Convert long filename to short filename (8.3) using cmd.exe

batch-file, command-line, long-filenames, short-filenames, windows

Solution

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

Problem

I am trying to convert a long filename to a short filename (8.3) on Windows. A batch-file with a command line argument works as intended: short.bat: ``` @echo OFF echo %~s1 ``` calling `short.bat C:\Documents and Settings\User\NTUSER.DAT` returns `C:\DOCUM~1\USER\NTUSER.DAT` However, I don't like having an extra .bat-file for this. I would rather call `cmd.exe` with the whole command from a ruby script. How can I do this? As an intermediate step I tried to hardcode the path in the batch-file, but that does not work: short1.bat: ``` @echo OFF SET filename="C:\Documents and Settings\User\NTUSER.DAT" echo %filename% echo %~sfilename% ``` `echo %filename%` works, but `echo %~sfilename%` gives the following error: ``` The following usage of the path operator in batch-parameter substitution is invalid: %~sfilename% For valid formats type CALL /? or FOR /? ``` If short1.bat works, how can I convert this into a one-liner that can be called with `cmd.exe \c ...`? There is another question (how to get DOS path instead of Windows path), however that one is specifically asking for the path of the current directory.

Original source

Related problems