Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 989
user1251007 Avatar asked Apr 19 '12 11:04

user1251007


People also ask

How do I get the 8.3 filename?

The 8.3 filename can be obtained using the Kernel32. dll function GetShortPathName. Although there is no compulsory algorithm for creating the 8.3 name from an LFN, Windows uses the following convention: If the LFN is 8.3 uppercase, no LFN will be stored on disk at all.


1 Answers

cmd /c for %A in ("C:\Documents and Settings\User\NTUSER.DAT") do @echo %~sA 
like image 150
dbenham Avatar answered Sep 21 '22 23:09

dbenham